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 :
21 : #include "DrawController.hxx"
22 : #include "DrawDocShell.hxx"
23 :
24 : #include "DrawSubController.hxx"
25 : #include "sdpage.hxx"
26 : #include "ViewShellBase.hxx"
27 : #include "ViewShellManager.hxx"
28 : #include "FormShellManager.hxx"
29 : #include "Window.hxx"
30 :
31 : #include <comphelper/anytostring.hxx>
32 : #include <comphelper/processfactory.hxx>
33 : #include <comphelper/sequence.hxx>
34 : #include <comphelper/stl_types.hxx>
35 : #include <comphelper/servicehelper.hxx>
36 : #include <cppuhelper/exc_hlp.hxx>
37 : #include <cppuhelper/bootstrap.hxx>
38 :
39 : #include <com/sun/star/beans/PropertyAttribute.hpp>
40 : #include <com/sun/star/drawing/framework/ConfigurationController.hpp>
41 : #include <com/sun/star/drawing/framework/ModuleController.hpp>
42 : #include <com/sun/star/lang/XInitialization.hpp>
43 :
44 : #include "slideshow.hxx"
45 :
46 : #include <svx/fmshell.hxx>
47 : #include <osl/mutex.hxx>
48 : #include <vcl/svapp.hxx>
49 : #include <boost/shared_ptr.hpp>
50 :
51 : using namespace ::std;
52 : using ::rtl::OUString;
53 : using namespace ::cppu;
54 : using namespace ::com::sun::star;
55 : using namespace ::com::sun::star::uno;
56 : using namespace ::com::sun::star::drawing::framework;
57 :
58 : namespace sd {
59 :
60 0 : DrawController::DrawController (ViewShellBase& rBase) throw()
61 : : DrawControllerInterfaceBase(&rBase),
62 : BroadcastHelperOwner(SfxBaseController::m_aMutex),
63 : OPropertySetHelper( static_cast<OBroadcastHelperVar<
64 : OMultiTypeInterfaceContainerHelper,
65 : OMultiTypeInterfaceContainerHelper::keyType>& >(
66 : BroadcastHelperOwner::maBroadcastHelper)),
67 : m_aSelectionTypeIdentifier(
68 0 : ::getCppuType( (Reference<view::XSelectionChangeListener > *)0 )),
69 : mpBase(&rBase),
70 : maLastVisArea(),
71 : mpCurrentPage(NULL),
72 : mbMasterPageMode(false),
73 : mbLayerMode(false),
74 : mbDisposing(false),
75 : mpPropertyArrayHelper(NULL),
76 : mxSubController(),
77 : mxConfigurationController(),
78 0 : mxModuleController()
79 : {
80 0 : ProvideFrameworkControllers();
81 0 : }
82 :
83 :
84 :
85 :
86 0 : DrawController::~DrawController (void) throw()
87 : {
88 0 : }
89 :
90 :
91 :
92 :
93 0 : void DrawController::SetSubController (
94 : const Reference<drawing::XDrawSubController>& rxSubController)
95 : {
96 : // Update the internal state.
97 0 : mxSubController = rxSubController;
98 0 : mpPropertyArrayHelper.reset();
99 0 : maLastVisArea = Rectangle();
100 :
101 : // Inform listeners about the changed state.
102 0 : FireSelectionChangeListener();
103 0 : }
104 :
105 :
106 :
107 :
108 : // XInterface
109 :
110 0 : IMPLEMENT_FORWARD_XINTERFACE2(
111 : DrawController,
112 : DrawControllerInterfaceBase,
113 : OPropertySetHelper);
114 :
115 :
116 : // XTypeProvider
117 :
118 0 : Sequence<Type> SAL_CALL DrawController::getTypes (void)
119 : throw (::com::sun::star::uno::RuntimeException)
120 : {
121 0 : ThrowIfDisposed();
122 : // OPropertySetHelper does not provide getTypes, so we have to
123 : // implement this method manually and list its three interfaces.
124 : OTypeCollection aTypeCollection (
125 0 : ::getCppuType (( const Reference<beans::XMultiPropertySet>*)NULL),
126 0 : ::getCppuType (( const Reference<beans::XFastPropertySet>*)NULL),
127 0 : ::getCppuType (( const Reference<beans::XPropertySet>*)NULL));
128 :
129 : return ::comphelper::concatSequences(
130 : SfxBaseController::getTypes(),
131 : aTypeCollection.getTypes(),
132 0 : DrawControllerInterfaceBase::getTypes());
133 : }
134 :
135 0 : IMPLEMENT_GET_IMPLEMENTATION_ID(DrawController);
136 :
137 :
138 :
139 : // XComponent
140 :
141 :
142 0 : void SAL_CALL DrawController::dispose (void)
143 : throw( RuntimeException )
144 : {
145 0 : if( !mbDisposing )
146 : {
147 0 : SolarMutexGuard aGuard;
148 :
149 0 : if( !mbDisposing )
150 : {
151 0 : mbDisposing = true;
152 :
153 0 : boost::shared_ptr<ViewShell> pViewShell;
154 0 : if (mpBase)
155 0 : pViewShell = mpBase->GetMainViewShell();
156 0 : if ( pViewShell )
157 : {
158 0 : pViewShell->DeactivateCurrentFunction();
159 0 : DrawDocShell* pDocShell = pViewShell->GetDocSh();
160 0 : if ( pDocShell != NULL )
161 0 : pDocShell->SetDocShellFunction(0);
162 : }
163 0 : pViewShell.reset();
164 :
165 : // When the controller has not been detached from its view
166 : // shell, i.e. mpViewShell is not NULL, then tell PaneManager
167 : // and ViewShellManager to clear the shell stack.
168 0 : if (mxSubController.is() && mpBase!=NULL)
169 : {
170 0 : mpBase->DisconnectAllClients();
171 0 : mpBase->GetViewShellManager()->Shutdown();
172 : }
173 :
174 0 : OPropertySetHelper::disposing();
175 :
176 0 : DisposeFrameworkControllers();
177 :
178 0 : SfxBaseController::dispose();
179 0 : }
180 : }
181 0 : }
182 :
183 :
184 :
185 :
186 0 : void SAL_CALL DrawController::addEventListener(
187 : const Reference<lang::XEventListener >& xListener)
188 : throw (RuntimeException)
189 : {
190 0 : ThrowIfDisposed();
191 0 : SfxBaseController::addEventListener( xListener );
192 0 : }
193 :
194 :
195 :
196 :
197 0 : void SAL_CALL DrawController::removeEventListener (
198 : const Reference<lang::XEventListener >& aListener)
199 : throw (RuntimeException)
200 : {
201 0 : if(!rBHelper.bDisposed && !rBHelper.bInDispose && !mbDisposing)
202 0 : SfxBaseController::removeEventListener( aListener );
203 0 : }
204 :
205 : // XController
206 0 : ::sal_Bool SAL_CALL DrawController::suspend( ::sal_Bool Suspend ) throw (::com::sun::star::uno::RuntimeException)
207 : {
208 0 : if( Suspend )
209 : {
210 0 : ViewShellBase* pViewShellBase = GetViewShellBase();
211 0 : if( pViewShellBase )
212 : {
213 : // do not allow suspend if a slideshow needs this controller!
214 0 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( *pViewShellBase ) );
215 0 : if( xSlideShow.is() && xSlideShow->dependsOn(pViewShellBase) )
216 0 : return sal_False;
217 : }
218 : }
219 :
220 0 : return SfxBaseController::suspend( Suspend );
221 : }
222 :
223 :
224 : // XServiceInfo
225 :
226 0 : OUString SAL_CALL DrawController::getImplementationName( ) throw(RuntimeException)
227 : {
228 : // Do not throw an excepetion at the moment. This leads to a crash
229 : // under Solaris on relead. See issue i70929 for details.
230 : // ThrowIfDisposed();
231 0 : return OUString("DrawController") ;
232 : }
233 :
234 :
235 :
236 3 : static OUString ssServiceName( "com.sun.star.drawing.DrawingDocumentDrawView");
237 :
238 0 : sal_Bool SAL_CALL DrawController::supportsService (
239 : const OUString& rsServiceName)
240 : throw(RuntimeException)
241 : {
242 : // Do not throw an exception at the moment. This leads to a crash
243 : // under Solaris on relead. See issue i70929 for details.
244 : // ThrowIfDisposed();
245 0 : return rsServiceName.equals(ssServiceName);
246 : }
247 :
248 :
249 :
250 :
251 0 : Sequence<OUString> SAL_CALL DrawController::getSupportedServiceNames (void)
252 : throw(RuntimeException)
253 : {
254 0 : ThrowIfDisposed();
255 0 : Sequence<OUString> aSupportedServices (1);
256 0 : OUString* pServices = aSupportedServices.getArray();
257 0 : pServices[0] = ssServiceName;
258 0 : return aSupportedServices;
259 : }
260 :
261 :
262 :
263 :
264 : //------ XSelectionSupplier --------------------------------------------
265 :
266 0 : sal_Bool SAL_CALL DrawController::select (const Any& aSelection)
267 : throw(lang::IllegalArgumentException, RuntimeException)
268 : {
269 0 : ThrowIfDisposed();
270 0 : SolarMutexGuard aGuard;
271 :
272 0 : if (mxSubController.is())
273 0 : return mxSubController->select(aSelection);
274 : else
275 0 : return false;
276 : }
277 :
278 :
279 :
280 :
281 0 : Any SAL_CALL DrawController::getSelection()
282 : throw(RuntimeException)
283 : {
284 0 : ThrowIfDisposed();
285 0 : SolarMutexGuard aGuard;
286 :
287 0 : if (mxSubController.is())
288 0 : return mxSubController->getSelection();
289 : else
290 0 : return Any();
291 : }
292 :
293 :
294 :
295 :
296 0 : void SAL_CALL DrawController::addSelectionChangeListener(
297 : const Reference< view::XSelectionChangeListener >& xListener)
298 : throw(RuntimeException)
299 : {
300 0 : if( mbDisposing )
301 0 : throw lang::DisposedException();
302 :
303 0 : BroadcastHelperOwner::maBroadcastHelper.addListener (m_aSelectionTypeIdentifier, xListener);
304 0 : }
305 :
306 :
307 :
308 :
309 0 : void SAL_CALL DrawController::removeSelectionChangeListener(
310 : const Reference< view::XSelectionChangeListener >& xListener )
311 : throw(RuntimeException)
312 : {
313 0 : if (rBHelper.bDisposed)
314 0 : throw lang::DisposedException();
315 :
316 0 : BroadcastHelperOwner::maBroadcastHelper.removeListener (m_aSelectionTypeIdentifier, xListener);
317 0 : }
318 :
319 :
320 :
321 :
322 :
323 : //===== lang::XEventListener ================================================
324 :
325 : void SAL_CALL
326 0 : DrawController::disposing (const lang::EventObject& )
327 : throw (uno::RuntimeException)
328 : {
329 0 : }
330 :
331 :
332 :
333 :
334 : //===== view::XSelectionChangeListener ======================================
335 :
336 : void SAL_CALL
337 0 : DrawController::selectionChanged (const lang::EventObject& rEvent)
338 : throw (uno::RuntimeException)
339 : {
340 0 : ThrowIfDisposed();
341 : // Have to forward the event to our selection change listeners.
342 : OInterfaceContainerHelper* pListeners = BroadcastHelperOwner::maBroadcastHelper.getContainer(
343 0 : ::getCppuType((Reference<view::XSelectionChangeListener>*)0));
344 0 : if (pListeners)
345 : {
346 : // Re-send the event to all of our listeners.
347 0 : OInterfaceIteratorHelper aIterator (*pListeners);
348 0 : while (aIterator.hasMoreElements())
349 : {
350 : try
351 : {
352 : view::XSelectionChangeListener* pListener =
353 : static_cast<view::XSelectionChangeListener*>(
354 0 : aIterator.next());
355 0 : if (pListener != NULL)
356 0 : pListener->selectionChanged (rEvent);
357 : }
358 0 : catch (const RuntimeException&)
359 : {
360 : }
361 0 : }
362 : }
363 0 : }
364 :
365 :
366 :
367 :
368 : // XDrawView
369 :
370 0 : void SAL_CALL DrawController::setCurrentPage( const Reference< drawing::XDrawPage >& xPage )
371 : throw(RuntimeException)
372 : {
373 0 : ThrowIfDisposed();
374 0 : SolarMutexGuard aGuard;
375 :
376 0 : if (mxSubController.is())
377 0 : mxSubController->setCurrentPage(xPage);
378 0 : }
379 :
380 :
381 :
382 :
383 0 : Reference< drawing::XDrawPage > SAL_CALL DrawController::getCurrentPage (void)
384 : throw(RuntimeException)
385 : {
386 0 : ThrowIfDisposed();
387 0 : SolarMutexGuard aGuard;
388 0 : Reference<drawing::XDrawPage> xPage;
389 :
390 : // Get current page from sub controller.
391 0 : if (mxSubController.is())
392 0 : xPage = mxSubController->getCurrentPage();
393 :
394 : // When there is not yet a sub controller (during initialization) then fall back
395 : // to the current page in mpCurrentPage.
396 0 : if ( ! xPage.is() && mpCurrentPage.is())
397 0 : xPage = Reference<drawing::XDrawPage>(mpCurrentPage->getUnoPage(), UNO_QUERY);
398 :
399 0 : return xPage;
400 : }
401 :
402 :
403 :
404 :
405 0 : void DrawController::FireVisAreaChanged (const Rectangle& rVisArea) throw()
406 : {
407 0 : if( maLastVisArea != rVisArea )
408 : {
409 0 : Any aNewValue;
410 : aNewValue <<= awt::Rectangle(
411 0 : rVisArea.Left(),
412 0 : rVisArea.Top(),
413 0 : rVisArea.GetWidth(),
414 0 : rVisArea.GetHeight() );
415 :
416 0 : Any aOldValue;
417 : aOldValue <<= awt::Rectangle(
418 0 : maLastVisArea.Left(),
419 0 : maLastVisArea.Top(),
420 0 : maLastVisArea.GetWidth(),
421 0 : maLastVisArea.GetHeight() );
422 :
423 0 : FirePropertyChange (PROPERTY_WORKAREA, aNewValue, aOldValue);
424 :
425 0 : maLastVisArea = rVisArea;
426 : }
427 0 : }
428 :
429 :
430 :
431 :
432 0 : void DrawController::FireSelectionChangeListener() throw()
433 : {
434 : OInterfaceContainerHelper * pLC = BroadcastHelperOwner::maBroadcastHelper.getContainer(
435 0 : m_aSelectionTypeIdentifier);
436 0 : if( pLC )
437 : {
438 0 : Reference< XInterface > xSource( (XWeak*)this );
439 0 : const lang::EventObject aEvent( xSource );
440 :
441 : // Ueber alle Listener iterieren und Events senden
442 0 : OInterfaceIteratorHelper aIt( *pLC);
443 0 : while( aIt.hasMoreElements() )
444 : {
445 : try
446 : {
447 : view::XSelectionChangeListener * pL =
448 0 : static_cast<view::XSelectionChangeListener*>(aIt.next());
449 0 : if (pL != NULL)
450 0 : pL->selectionChanged( aEvent );
451 : }
452 0 : catch (const RuntimeException&)
453 : {
454 : }
455 0 : }
456 : }
457 0 : }
458 :
459 :
460 :
461 :
462 0 : void DrawController::FireChangeEditMode (bool bMasterPageMode) throw()
463 : {
464 0 : if (bMasterPageMode != mbMasterPageMode )
465 : {
466 : FirePropertyChange(
467 : PROPERTY_MASTERPAGEMODE,
468 : makeAny(bMasterPageMode),
469 0 : makeAny(mbMasterPageMode));
470 :
471 0 : mbMasterPageMode = bMasterPageMode;
472 : }
473 0 : }
474 :
475 :
476 :
477 :
478 0 : void DrawController::FireChangeLayerMode (bool bLayerMode) throw()
479 : {
480 0 : if (bLayerMode != mbLayerMode)
481 : {
482 : FirePropertyChange(
483 : PROPERTY_LAYERMODE,
484 : makeAny(bLayerMode),
485 0 : makeAny(mbLayerMode));
486 :
487 0 : mbLayerMode = bLayerMode;
488 : }
489 0 : }
490 :
491 :
492 :
493 :
494 0 : void DrawController::FireSwitchCurrentPage (SdPage* pNewCurrentPage) throw()
495 : {
496 0 : SdrPage* pCurrentPage = mpCurrentPage.get();
497 0 : if (pNewCurrentPage != pCurrentPage)
498 : {
499 : try
500 : {
501 : Any aNewValue (
502 0 : makeAny(Reference<drawing::XDrawPage>(pNewCurrentPage->getUnoPage(), UNO_QUERY)));
503 :
504 0 : Any aOldValue;
505 0 : if (pCurrentPage != NULL)
506 : {
507 0 : Reference<drawing::XDrawPage> xOldPage (pCurrentPage->getUnoPage(), UNO_QUERY);
508 0 : aOldValue <<= xOldPage;
509 : }
510 :
511 0 : FirePropertyChange(PROPERTY_CURRENTPAGE, aNewValue, aOldValue);
512 :
513 0 : mpCurrentPage.reset(pNewCurrentPage);
514 : }
515 0 : catch (const uno::Exception&)
516 : {
517 : OSL_FAIL(
518 : OString("sd::SdUnoDrawView::FireSwitchCurrentPage(), exception caught: " +
519 : ::rtl::OUStringToOString(
520 : comphelper::anyToString( cppu::getCaughtException() ),
521 : RTL_TEXTENCODING_UTF8 )).getStr() );
522 : }
523 : }
524 0 : }
525 :
526 :
527 :
528 :
529 0 : void DrawController::FirePropertyChange (
530 : sal_Int32 nHandle,
531 : const Any& rNewValue,
532 : const Any& rOldValue)
533 : {
534 : try
535 : {
536 0 : fire (&nHandle, &rNewValue, &rOldValue, 1, sal_False);
537 : }
538 0 : catch (const RuntimeException&)
539 : {
540 : // Ignore this exception. Exceptions should be handled in the
541 : // fire() function so that all listeners are called. This is
542 : // not the case at the moment, so we simply ignore the
543 : // exception.
544 : }
545 :
546 0 : }
547 :
548 :
549 :
550 :
551 0 : ViewShellBase* DrawController::GetViewShellBase (void)
552 : {
553 0 : return mpBase;
554 : }
555 :
556 :
557 :
558 :
559 0 : void DrawController::ReleaseViewShellBase (void)
560 : {
561 0 : DisposeFrameworkControllers();
562 0 : mpBase = NULL;
563 0 : }
564 :
565 :
566 :
567 :
568 : //===== XControllerManager ==============================================================
569 :
570 : Reference<XConfigurationController> SAL_CALL
571 0 : DrawController::getConfigurationController (void)
572 : throw (RuntimeException)
573 : {
574 0 : ThrowIfDisposed();
575 :
576 0 : return mxConfigurationController;
577 : }
578 :
579 :
580 :
581 :
582 : Reference<XModuleController> SAL_CALL
583 0 : DrawController::getModuleController (void)
584 : throw (RuntimeException)
585 : {
586 0 : ThrowIfDisposed();
587 :
588 0 : return mxModuleController;
589 : }
590 :
591 :
592 :
593 :
594 : //===== XUnoTunnel ============================================================
595 :
596 : namespace
597 : {
598 : class theDrawControllerUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theDrawControllerUnoTunnelId> {};
599 : }
600 :
601 0 : const Sequence<sal_Int8>& DrawController::getUnoTunnelId (void)
602 : {
603 0 : return theDrawControllerUnoTunnelId::get().getSeq();
604 : }
605 :
606 :
607 :
608 :
609 0 : sal_Int64 SAL_CALL DrawController::getSomething (const Sequence<sal_Int8>& rId)
610 : throw (RuntimeException)
611 : {
612 0 : sal_Int64 nResult = 0;
613 :
614 0 : if (rId.getLength() == 16
615 0 : && memcmp(getUnoTunnelId().getConstArray(), rId.getConstArray(), 16) == 0)
616 : {
617 0 : nResult = sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
618 : }
619 :
620 0 : return nResult;
621 : }
622 :
623 :
624 :
625 :
626 : //===== Properties ============================================================
627 :
628 0 : void DrawController::FillPropertyTable (
629 : ::std::vector<beans::Property>& rProperties)
630 : {
631 : rProperties.push_back(
632 : beans::Property("VisibleArea",
633 : PROPERTY_WORKAREA,
634 0 : ::getCppuType((const ::com::sun::star::awt::Rectangle*)0),
635 0 : beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY));
636 : rProperties.push_back(
637 : beans::Property(
638 : "SubController",
639 : PROPERTY_SUB_CONTROLLER,
640 0 : ::getCppuType((const Reference<drawing::XDrawSubController>*)0),
641 0 : beans::PropertyAttribute::BOUND));
642 : rProperties.push_back(
643 : beans::Property(
644 : "CurrentPage",
645 : PROPERTY_CURRENTPAGE,
646 0 : ::getCppuType((const Reference< drawing::XDrawPage > *)0),
647 0 : beans::PropertyAttribute::BOUND ));
648 : rProperties.push_back(
649 : beans::Property("IsLayerMode",
650 : PROPERTY_LAYERMODE,
651 0 : ::getCppuBooleanType(),
652 0 : beans::PropertyAttribute::BOUND ));
653 : rProperties.push_back(
654 : beans::Property("IsMasterPageMode",
655 : PROPERTY_MASTERPAGEMODE,
656 0 : ::getCppuBooleanType(),
657 0 : beans::PropertyAttribute::BOUND ));
658 : rProperties.push_back(
659 : beans::Property("ActiveLayer",
660 : PROPERTY_ACTIVE_LAYER,
661 0 : ::getCppuBooleanType(),
662 0 : beans::PropertyAttribute::BOUND ));
663 : rProperties.push_back(
664 : beans::Property("ZoomValue",
665 : PROPERTY_ZOOMVALUE,
666 0 : ::getCppuType((const sal_Int16*)0),
667 0 : beans::PropertyAttribute::BOUND ));
668 : rProperties.push_back(
669 : beans::Property("ZoomType",
670 : PROPERTY_ZOOMTYPE,
671 0 : ::getCppuType((const sal_Int16*)0),
672 0 : beans::PropertyAttribute::BOUND ));
673 : rProperties.push_back(
674 : beans::Property("ViewOffset",
675 : PROPERTY_VIEWOFFSET,
676 0 : ::getCppuType((const ::com::sun::star::awt::Point*)0),
677 0 : beans::PropertyAttribute::BOUND ));
678 : rProperties.push_back(
679 : beans::Property("DrawViewMode",
680 : PROPERTY_DRAWVIEWMODE,
681 0 : ::getCppuType((const ::com::sun::star::awt::Point*)0),
682 0 : beans::PropertyAttribute::BOUND|beans::PropertyAttribute::READONLY|beans::PropertyAttribute::MAYBEVOID ));
683 0 : }
684 :
685 :
686 :
687 :
688 0 : IPropertyArrayHelper & DrawController::getInfoHelper()
689 : {
690 0 : SolarMutexGuard aGuard;
691 :
692 0 : if (mpPropertyArrayHelper.get() == NULL)
693 : {
694 0 : ::std::vector<beans::Property> aProperties;
695 0 : FillPropertyTable (aProperties);
696 0 : Sequence<beans::Property> aPropertySequence (aProperties.size());
697 0 : for (unsigned int i=0; i<aProperties.size(); i++)
698 0 : aPropertySequence[i] = aProperties[i];
699 0 : mpPropertyArrayHelper.reset(new OPropertyArrayHelper(aPropertySequence, sal_False));
700 : }
701 :
702 0 : return *mpPropertyArrayHelper.get();
703 : }
704 :
705 :
706 :
707 :
708 0 : Reference < beans::XPropertySetInfo > DrawController::getPropertySetInfo()
709 : throw ( ::com::sun::star::uno::RuntimeException)
710 : {
711 0 : SolarMutexGuard aGuard;
712 :
713 0 : static Reference < beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
714 0 : return xInfo;
715 : }
716 :
717 :
718 0 : uno::Reference< form::runtime::XFormController > SAL_CALL DrawController::getFormController( const uno::Reference< form::XForm >& Form ) throw (uno::RuntimeException)
719 : {
720 0 : SolarMutexGuard aGuard;
721 :
722 0 : FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
723 0 : SdrView* pSdrView = mpBase->GetDrawView();
724 0 : ::boost::shared_ptr<ViewShell> pViewShell = mpBase->GetMainViewShell();
725 0 : ::sd::Window* pWindow = pViewShell ? pViewShell->GetActiveWindow() : NULL;
726 :
727 0 : uno::Reference< form::runtime::XFormController > xController( NULL );
728 0 : if ( pFormShell && pSdrView && pWindow )
729 0 : xController = pFormShell->GetFormController( Form, *pSdrView, *pWindow );
730 0 : return xController;
731 : }
732 :
733 0 : ::sal_Bool SAL_CALL DrawController::isFormDesignMode( ) throw (uno::RuntimeException)
734 : {
735 0 : SolarMutexGuard aGuard;
736 :
737 0 : sal_Bool bIsDesignMode = sal_True;
738 :
739 0 : FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
740 0 : if ( pFormShell )
741 0 : bIsDesignMode = pFormShell->IsDesignMode();
742 :
743 0 : return bIsDesignMode;
744 : }
745 :
746 0 : void SAL_CALL DrawController::setFormDesignMode( ::sal_Bool _DesignMode ) throw (uno::RuntimeException)
747 : {
748 0 : SolarMutexGuard aGuard;
749 :
750 0 : FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
751 0 : if ( pFormShell )
752 0 : pFormShell->SetDesignMode( _DesignMode );
753 0 : }
754 :
755 0 : uno::Reference< awt::XControl > SAL_CALL DrawController::getControl( const uno::Reference< awt::XControlModel >& xModel ) throw (container::NoSuchElementException, uno::RuntimeException)
756 : {
757 0 : SolarMutexGuard aGuard;
758 :
759 0 : FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
760 0 : SdrView* pSdrView = mpBase->GetDrawView();
761 0 : ::boost::shared_ptr<ViewShell> pViewShell = mpBase->GetMainViewShell();
762 0 : ::sd::Window* pWindow = pViewShell ? pViewShell->GetActiveWindow() : NULL;
763 :
764 0 : uno::Reference< awt::XControl > xControl( NULL );
765 0 : if ( pFormShell && pSdrView && pWindow )
766 0 : pFormShell->GetFormControl( xModel, *pSdrView, *pWindow, xControl );
767 0 : return xControl;
768 : }
769 :
770 :
771 :
772 :
773 0 : sal_Bool DrawController::convertFastPropertyValue (
774 : Any & rConvertedValue,
775 : Any & rOldValue,
776 : sal_Int32 nHandle,
777 : const Any& rValue)
778 : throw ( com::sun::star::lang::IllegalArgumentException)
779 : {
780 0 : sal_Bool bResult = sal_False;
781 :
782 0 : if (nHandle == PROPERTY_SUB_CONTROLLER)
783 : {
784 0 : rOldValue <<= mxSubController;
785 0 : rConvertedValue <<= Reference<drawing::XDrawSubController>(rValue, UNO_QUERY);
786 0 : bResult = (rOldValue != rConvertedValue);
787 : }
788 0 : else if (mxSubController.is())
789 : {
790 0 : rConvertedValue = rValue;
791 : try
792 : {
793 0 : rOldValue = mxSubController->getFastPropertyValue(nHandle);
794 0 : bResult = (rOldValue != rConvertedValue);
795 : }
796 0 : catch (const beans::UnknownPropertyException&)
797 : {
798 : // The property is unknown and thus an illegal argument to this method.
799 0 : throw com::sun::star::lang::IllegalArgumentException();
800 : }
801 : }
802 :
803 0 : return bResult;
804 : }
805 :
806 :
807 :
808 :
809 0 : void DrawController::setFastPropertyValue_NoBroadcast (
810 : sal_Int32 nHandle,
811 : const Any& rValue)
812 : throw ( com::sun::star::uno::Exception)
813 : {
814 0 : SolarMutexGuard aGuard;
815 0 : if (nHandle == PROPERTY_SUB_CONTROLLER)
816 0 : SetSubController(Reference<drawing::XDrawSubController>(rValue, UNO_QUERY));
817 0 : else if (mxSubController.is())
818 0 : mxSubController->setFastPropertyValue(nHandle, rValue);
819 0 : }
820 :
821 :
822 :
823 :
824 0 : void DrawController::getFastPropertyValue (
825 : Any & rRet,
826 : sal_Int32 nHandle ) const
827 : {
828 0 : SolarMutexGuard aGuard;
829 :
830 0 : switch( nHandle )
831 : {
832 : case PROPERTY_WORKAREA:
833 : rRet <<= awt::Rectangle(
834 0 : maLastVisArea.Left(),
835 0 : maLastVisArea.Top(),
836 0 : maLastVisArea.GetWidth(),
837 0 : maLastVisArea.GetHeight());
838 0 : break;
839 :
840 : case PROPERTY_SUB_CONTROLLER:
841 0 : rRet <<= mxSubController;
842 0 : break;
843 :
844 : default:
845 0 : if (mxSubController.is())
846 0 : rRet = mxSubController->getFastPropertyValue(nHandle);
847 0 : break;
848 0 : }
849 0 : }
850 :
851 :
852 :
853 :
854 : //-----------------------------------------------------------------------------
855 :
856 0 : void DrawController::ProvideFrameworkControllers (void)
857 : {
858 0 : SolarMutexGuard aGuard;
859 : try
860 : {
861 0 : Reference<XController> xController (this);
862 : const Reference<XComponentContext> xContext (
863 0 : ::comphelper::getProcessComponentContext() );
864 : mxConfigurationController = ConfigurationController::create(
865 : xContext,
866 0 : xController);
867 : mxModuleController = ModuleController::create(
868 : xContext,
869 0 : xController);
870 : }
871 0 : catch (const RuntimeException&)
872 : {
873 0 : mxConfigurationController = NULL;
874 0 : mxModuleController = NULL;
875 0 : }
876 0 : }
877 :
878 :
879 :
880 :
881 0 : void DrawController::DisposeFrameworkControllers (void)
882 : {
883 0 : Reference<XComponent> xComponent (mxModuleController, UNO_QUERY);
884 0 : if (xComponent.is())
885 0 : xComponent->dispose();
886 :
887 0 : xComponent = Reference<XComponent>(mxConfigurationController, UNO_QUERY);
888 0 : if (xComponent.is())
889 0 : xComponent->dispose();
890 0 : }
891 :
892 :
893 :
894 :
895 0 : void DrawController::ThrowIfDisposed (void) const
896 : throw (::com::sun::star::lang::DisposedException)
897 : {
898 0 : if (rBHelper.bDisposed || rBHelper.bInDispose || mbDisposing)
899 : {
900 : OSL_TRACE ("Calling disposed DrawController object. Throwing exception:");
901 : throw lang::DisposedException (
902 : "DrawController object has already been disposed",
903 0 : const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
904 : }
905 0 : }
906 :
907 :
908 :
909 :
910 :
911 9 : } // end of namespace sd
912 :
913 :
914 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|