xref: /trunk/main/svx/source/svdraw/svdouno.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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_svx.hxx"
26 #include <svx/sdr/contact/viewcontactofunocontrol.hxx>
27 #include <svx/sdr/contact/viewobjectcontactofunocontrol.hxx>
28 #include <com/sun/star/container/XChild.hpp>
29 #include <com/sun/star/awt/XWindow.hpp>
30 #include <com/sun/star/awt/PosSize.hpp>
31 #include <com/sun/star/beans/XPropertySet.hpp>
32 #include <com/sun/star/io/XPersistObject.hpp>
33 #include <com/sun/star/io/XOutputStream.hpp>
34 #include <com/sun/star/io/XInputStream.hpp>
35 #include <com/sun/star/io/XActiveDataSink.hpp>
36 #include <com/sun/star/io/XActiveDataSource.hpp>
37 #include <com/sun/star/io/XObjectOutputStream.hpp>
38 #include <com/sun/star/io/XObjectInputStream.hpp>
39 #include <com/sun/star/util/XCloneable.hpp>
40 #include <comphelper/processfactory.hxx>
41 #include <comphelper/types.hxx>
42 #include <vcl/pdfextoutdevdata.hxx>
43 #include <svx/svdouno.hxx>
44 #include <svx/svdpagv.hxx>
45 #include <svx/svdmodel.hxx>
46 #include "svx/svdglob.hxx"  // Stringcache
47 #include "svx/svdstr.hrc"   // Objektname
48 #include <svx/svdetc.hxx>
49 #include <svx/svdview.hxx>
50 #include <svx/svdorect.hxx>
51 #include "svx/svdviter.hxx"
52 #include <rtl/ref.hxx>
53 #include <set>
54 #include <memory>
55 #include <svx/sdrpagewindow.hxx>
56 #include <svx/sdrpaintwindow.hxx>
57 #include <tools/diagnose_ex.h>
58 #include <svx/svdograf.hxx>
59 
60 using namespace ::com::sun::star;
61 using namespace ::sdr::contact;
62 
63 //************************************************************
64 //   Defines
65 //************************************************************
66 
67 //************************************************************
68 //   Hilfsklasse SdrControlEventListenerImpl
69 //************************************************************
70 #include <com/sun/star/lang/XEventListener.hpp>
71 
72 #include <cppuhelper/implbase1.hxx>
73 
74 // =============================================================================
75 class SdrControlEventListenerImpl : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
76 {
77 protected:
78     SdrUnoObj*                  pObj;
79 
80 public:
SdrControlEventListenerImpl(SdrUnoObj * _pObj)81     SdrControlEventListenerImpl(SdrUnoObj* _pObj)
82     :   pObj(_pObj)
83     {}
84 
85     // XEventListener
86     virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source );
87 
88     void StopListening(const uno::Reference< lang::XComponent >& xComp);
89     void StartListening(const uno::Reference< lang::XComponent >& xComp);
90 };
91 
92 // XEventListener
disposing(const::com::sun::star::lang::EventObject &)93 void SAL_CALL SdrControlEventListenerImpl::disposing( const ::com::sun::star::lang::EventObject& /*Source*/)
94 {
95     if (pObj)
96     {
97         pObj->xUnoControlModel = NULL;
98     }
99 }
100 
StopListening(const uno::Reference<lang::XComponent> & xComp)101 void SdrControlEventListenerImpl::StopListening(const uno::Reference< lang::XComponent >& xComp)
102 {
103     if (xComp.is())
104         xComp->removeEventListener(this);
105 }
106 
StartListening(const uno::Reference<lang::XComponent> & xComp)107 void SdrControlEventListenerImpl::StartListening(const uno::Reference< lang::XComponent >& xComp)
108 {
109     if (xComp.is())
110         xComp->addEventListener(this);
111 }
112 
113 // =============================================================================
114 struct SAL_DLLPRIVATE SdrUnoObjDataHolder
115 {
116     mutable ::rtl::Reference< SdrControlEventListenerImpl >
117                                     pEventListener;
118 };
119 
120 // =============================================================================
121 namespace
122 {
lcl_ensureControlVisibility(SdrView * _pView,const SdrUnoObj * _pObject,bool _bVisible)123     void lcl_ensureControlVisibility( SdrView* _pView, const SdrUnoObj* _pObject, bool _bVisible )
124     {
125         OSL_PRECOND( _pObject, "lcl_ensureControlVisibility: no object -> no survival!" );
126 
127         SdrPageView* pPageView = _pView ? _pView->GetSdrPageView() : NULL;
128         DBG_ASSERT( pPageView, "lcl_ensureControlVisibility: no view found!" );
129         if ( !pPageView )
130             return;
131 
132         ViewContact& rUnoControlContact( _pObject->GetViewContact() );
133 
134         for ( sal_uInt32 i = 0; i < pPageView->PageWindowCount(); ++i )
135         {
136             const SdrPageWindow* pPageWindow = pPageView->GetPageWindow( i );
137             DBG_ASSERT( pPageWindow, "lcl_ensureControlVisibility: invalid PageViewWindow!" );
138             if ( !pPageWindow )
139                 continue;
140 
141             if ( !pPageWindow->HasObjectContact() )
142                 continue;
143 
144             ObjectContact& rPageViewContact( pPageWindow->GetObjectContact() );
145             const ViewObjectContact& rViewObjectContact( rUnoControlContact.GetViewObjectContact( rPageViewContact ) );
146             const ViewObjectContactOfUnoControl* pUnoControlContact = dynamic_cast< const ViewObjectContactOfUnoControl* >( &rViewObjectContact );
147             DBG_ASSERT( pUnoControlContact, "lcl_ensureControlVisibility: wrong ViewObjectContact type!" );
148             if ( !pUnoControlContact )
149                 continue;
150 
151             pUnoControlContact->ensureControlVisibility( _bVisible );
152         }
153     }
154 }
155 
156 //************************************************************
157 //   SdrUnoObj
158 //************************************************************
159 
160 TYPEINIT1(SdrUnoObj, SdrRectObj);
161 
SdrUnoObj(const String & rModelName,sal_Bool _bOwnUnoControlModel)162 SdrUnoObj::SdrUnoObj(const String& rModelName, sal_Bool _bOwnUnoControlModel)
163 :   m_pImpl( new SdrUnoObjDataHolder ),
164     bOwnUnoControlModel( _bOwnUnoControlModel )
165 {
166     bIsUnoObj = sal_True;
167 
168     m_pImpl->pEventListener = new SdrControlEventListenerImpl(this);
169 
170     // nur ein owner darf eigenstaendig erzeugen
171     if (rModelName.Len())
172         CreateUnoControlModel(rModelName);
173 }
174 
SdrUnoObj(const String & rModelName,const uno::Reference<lang::XMultiServiceFactory> & rxSFac,sal_Bool _bOwnUnoControlModel)175 SdrUnoObj::SdrUnoObj(const String& rModelName,
176                      const uno::Reference< lang::XMultiServiceFactory >& rxSFac,
177                      sal_Bool _bOwnUnoControlModel)
178 :   m_pImpl( new SdrUnoObjDataHolder ),
179     bOwnUnoControlModel( _bOwnUnoControlModel )
180 {
181     bIsUnoObj = sal_True;
182 
183     m_pImpl->pEventListener = new SdrControlEventListenerImpl(this);
184 
185     // nur ein owner darf eigenstaendig erzeugen
186     if (rModelName.Len())
187         CreateUnoControlModel(rModelName,rxSFac);
188 }
189 
~SdrUnoObj()190 SdrUnoObj::~SdrUnoObj()
191 {
192     try
193     {
194         // clean up the control model
195         uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
196         if (xComp.is())
197         {
198             // is the control model owned by it's environment?
199             uno::Reference< container::XChild > xContent(xUnoControlModel, uno::UNO_QUERY);
200             if (xContent.is() && !xContent->getParent().is())
201                 xComp->dispose();
202             else
203                 m_pImpl->pEventListener->StopListening(xComp);
204         }
205     }
206     catch( const uno::Exception& )
207     {
208         OSL_ENSURE( sal_False, "SdrUnoObj::~SdrUnoObj: caught an exception!" );
209     }
210     delete m_pImpl;
211 }
212 
SetModel(SdrModel * pNewModel)213 void SdrUnoObj::SetModel(SdrModel* pNewModel)
214 {
215     SdrRectObj::SetModel(pNewModel);
216 }
217 
SetPage(SdrPage * pNewPage)218 void SdrUnoObj::SetPage(SdrPage* pNewPage)
219 {
220     SdrRectObj::SetPage(pNewPage);
221 }
222 
TakeObjInfo(SdrObjTransformInfoRec & rInfo) const223 void SdrUnoObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
224 {
225     rInfo.bRotateFreeAllowed        =   sal_False;
226     rInfo.bRotate90Allowed          =   sal_False;
227     rInfo.bMirrorFreeAllowed        =   sal_False;
228     rInfo.bMirror45Allowed          =   sal_False;
229     rInfo.bMirror90Allowed          =   sal_False;
230     rInfo.bTransparenceAllowed = sal_False;
231     rInfo.bGradientAllowed = sal_False;
232     rInfo.bShearAllowed             =   sal_False;
233     rInfo.bEdgeRadiusAllowed        =   sal_False;
234     rInfo.bNoOrthoDesired           =   sal_False;
235     rInfo.bCanConvToPath            =   sal_False;
236     rInfo.bCanConvToPoly            =   sal_False;
237     rInfo.bCanConvToPathLineToArea  =   sal_False;
238     rInfo.bCanConvToPolyLineToArea  =   sal_False;
239     rInfo.bCanConvToContour = sal_False;
240 }
241 
GetObjIdentifier() const242 sal_uInt16 SdrUnoObj::GetObjIdentifier() const
243 {
244     return sal_uInt16(OBJ_UNO);
245 }
246 
SetContextWritingMode(const sal_Int16 _nContextWritingMode)247 void SdrUnoObj::SetContextWritingMode( const sal_Int16 _nContextWritingMode )
248 {
249     try
250     {
251         uno::Reference< beans::XPropertySet > xModelProperties( GetUnoControlModel(), uno::UNO_QUERY_THROW );
252         xModelProperties->setPropertyValue(
253             ::rtl::OUString::intern( RTL_CONSTASCII_USTRINGPARAM( "ContextWritingMode" ) ),
254             uno::makeAny( _nContextWritingMode )
255         );
256     }
257     catch( const uno::Exception& )
258     {
259         DBG_UNHANDLED_EXCEPTION();
260     }
261 }
262 
263 // ----------------------------------------------------------------------------
264 namespace
265 {
266     /** helper class to restore graphics at <awt::XView> object after <SdrUnoObj::Paint>
267 
268         OD 08.05.2003 #109432#
269         Restoration of graphics necessary to assure that paint on a window
270 
271         @author OD
272     */
273     class RestoreXViewGraphics
274     {
275         private:
276             uno::Reference< awt::XView >        m_rXView;
277             uno::Reference< awt::XGraphics >    m_rXGraphics;
278 
279         public:
RestoreXViewGraphics(const uno::Reference<awt::XView> & _rXView)280             RestoreXViewGraphics( const uno::Reference< awt::XView >& _rXView )
281             {
282                 m_rXView = _rXView;
283                 m_rXGraphics = m_rXView->getGraphics();
284             }
~RestoreXViewGraphics()285             ~RestoreXViewGraphics()
286             {
287                 m_rXView->setGraphics( m_rXGraphics );
288             }
289     };
290 }
291 
TakeObjNameSingul(XubString & rName) const292 void SdrUnoObj::TakeObjNameSingul(XubString& rName) const
293 {
294     rName = ImpGetResStr(STR_ObjNameSingulUno);
295 
296     String aName( GetName() );
297     if(aName.Len())
298     {
299         rName += sal_Unicode(' ');
300         rName += sal_Unicode('\'');
301         rName += aName;
302         rName += sal_Unicode('\'');
303     }
304 }
305 
TakeObjNamePlural(XubString & rName) const306 void SdrUnoObj::TakeObjNamePlural(XubString& rName) const
307 {
308     rName = ImpGetResStr(STR_ObjNamePluralUno);
309 }
310 
operator =(const SdrObject & rObj)311 void SdrUnoObj::operator = (const SdrObject& rObj)
312 {
313     SdrRectObj::operator = (rObj);
314 
315     // release the reference to the current control model
316     SetUnoControlModel( NULL );
317 
318     const SdrUnoObj& rUnoObj = dynamic_cast< const SdrUnoObj& >( rObj );
319 
320     aUnoControlModelTypeName = rUnoObj.aUnoControlModelTypeName;
321     aUnoControlTypeName = rUnoObj.aUnoControlTypeName;
322 
323     // copy the uno control model
324     const uno::Reference< awt::XControlModel > xSourceControlModel( rUnoObj.GetUnoControlModel(), uno::UNO_QUERY );
325     if ( xSourceControlModel.is() )
326     {
327         try
328         {
329             uno::Reference< util::XCloneable > xClone( xSourceControlModel, uno::UNO_QUERY_THROW );
330             xUnoControlModel.set( xClone->createClone(), uno::UNO_QUERY_THROW );
331         }
332         catch( const uno::Exception& )
333         {
334             DBG_UNHANDLED_EXCEPTION();
335         }
336     }
337 
338     // get service name of the control from the control model
339     uno::Reference< beans::XPropertySet > xSet(xUnoControlModel, uno::UNO_QUERY);
340     if (xSet.is())
341     {
342         uno::Any aValue( xSet->getPropertyValue( rtl::OUString::createFromAscii("DefaultControl")) );
343         ::rtl::OUString aStr;
344 
345         if( aValue >>= aStr )
346             aUnoControlTypeName = String(aStr);
347     }
348 
349     uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
350     if (xComp.is())
351         m_pImpl->pEventListener->StartListening(xComp);
352 }
353 
NbcResize(const Point & rRef,const Fraction & xFact,const Fraction & yFact)354 void SdrUnoObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
355 {
356     SdrRectObj::NbcResize(rRef,xFact,yFact);
357 
358     if (aGeo.nShearWink!=0 || aGeo.nDrehWink!=0)
359     {
360         // kleine Korrekturen
361         if (aGeo.nDrehWink>=9000 && aGeo.nDrehWink<27000)
362         {
363             aRect.Move(aRect.Left()-aRect.Right(),aRect.Top()-aRect.Bottom());
364         }
365 
366         aGeo.nDrehWink  = 0;
367         aGeo.nShearWink = 0;
368         aGeo.nSin       = 0.0;
369         aGeo.nCos       = 1.0;
370         aGeo.nTan       = 0.0;
371         SetRectsDirty();
372     }
373 }
374 
375 // -----------------------------------------------------------------------------
376 
hasSpecialDrag() const377 bool SdrUnoObj::hasSpecialDrag() const
378 {
379     // no special drag; we have no rounding rect and
380     // do want frame handles
381     return false;
382 }
383 
supportsFullDrag() const384 bool SdrUnoObj::supportsFullDrag() const
385 {
386     // overloaded to have the possibility to enable/disable in debug and
387     // to ckeck some things out. Current solution is working, so default is
388     // enabled
389     static bool bDoSupportFullDrag(true);
390 
391     return bDoSupportFullDrag;
392 }
393 
getFullDragClone() const394 SdrObject* SdrUnoObj::getFullDragClone() const
395 {
396     SdrObject* pRetval = 0;
397     static bool bHandleSpecial(false);
398 
399     if(bHandleSpecial)
400     {
401         // special handling for SdrUnoObj (FormControl). Create a SdrGrafObj
402         // for drag containing the graphical representation. This does not work too
403         // well, so the default is to simply clone
404         pRetval = new SdrGrafObj(SdrDragView::GetObjGraphic(GetModel(), this), GetLogicRect());
405     }
406     else
407     {
408         // call parent (simply clone)
409         pRetval = SdrRectObj::getFullDragClone();
410     }
411 
412     return pRetval;
413 }
414 
415 // -----------------------------------------------------------------------------
NbcSetLayer(SdrLayerID _nLayer)416 void SdrUnoObj::NbcSetLayer( SdrLayerID _nLayer )
417 {
418     if ( GetLayer() == _nLayer )
419     {   // redundant call -> not interested in doing anything here
420         SdrRectObj::NbcSetLayer( _nLayer );
421         return;
422     }
423 
424     // we need some special handling here in case we're moved from an invisible layer
425     // to a visible one, or vice versa
426     // (relative to a layer. Remember that the visibility of a layer is a view attribute
427     // - the same layer can be visible in one view, and invisible in another view, at the
428     // same time)
429     // 2003-06-03 - #110592# - fs@openoffice.org
430 
431     // collect all views in which our old layer is visible
432     ::std::set< SdrView* > aPreviouslyVisible;
433 
434     {
435         SdrViewIter aIter( this );
436         for ( SdrView* pView = aIter.FirstView(); pView; pView = aIter.NextView() )
437             aPreviouslyVisible.insert( pView );
438     }
439 
440     SdrRectObj::NbcSetLayer( _nLayer );
441 
442     // collect all views in which our new layer is visible
443     ::std::set< SdrView* > aNewlyVisible;
444 
445     {
446         SdrViewIter aIter( this );
447         for ( SdrView* pView = aIter.FirstView(); pView; pView = aIter.NextView() )
448         {
449             ::std::set< SdrView* >::const_iterator aPrevPos = aPreviouslyVisible.find( pView );
450             if ( aPreviouslyVisible.end() != aPrevPos )
451             {   // in pView, we were visible _before_ the layer change, and are
452                 // visible _after_ the layer change, too
453                 // -> we're not interested in this view at all
454                 aPreviouslyVisible.erase( aPrevPos );
455             }
456             else
457             {
458                 // in pView, we were visible _before_ the layer change, and are
459                 // _not_ visible after the layer change
460                 // => remember this view, as our visibility there changed
461                 aNewlyVisible.insert( pView );
462             }
463         }
464     }
465 
466     // now aPreviouslyVisible contains all views where we became invisible
467     ::std::set< SdrView* >::const_iterator aLoopViews;
468     for (   aLoopViews = aPreviouslyVisible.begin();
469             aLoopViews != aPreviouslyVisible.end();
470             ++aLoopViews
471         )
472     {
473         lcl_ensureControlVisibility( *aLoopViews, this, false );
474     }
475 
476     // and aNewlyVisible all views where we became visible
477     for (   aLoopViews = aNewlyVisible.begin();
478             aLoopViews != aNewlyVisible.end();
479             ++aLoopViews
480         )
481     {
482         lcl_ensureControlVisibility( *aLoopViews, this, true );
483     }
484 }
485 
CreateUnoControlModel(const String & rModelName)486 void SdrUnoObj::CreateUnoControlModel(const String& rModelName)
487 {
488     DBG_ASSERT(!xUnoControlModel.is(), "model already exists");
489 
490     aUnoControlModelTypeName = rModelName;
491 
492     uno::Reference< awt::XControlModel >   xModel;
493     uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
494     if (aUnoControlModelTypeName.Len() && xFactory.is() )
495     {
496         xModel = uno::Reference< awt::XControlModel >(xFactory->createInstance(
497             aUnoControlModelTypeName), uno::UNO_QUERY);
498 
499         if (xModel.is())
500             SetChanged();
501     }
502 
503     SetUnoControlModel(xModel);
504 }
505 
CreateUnoControlModel(const String & rModelName,const uno::Reference<lang::XMultiServiceFactory> & rxSFac)506 void SdrUnoObj::CreateUnoControlModel(const String& rModelName,
507                                       const uno::Reference< lang::XMultiServiceFactory >& rxSFac)
508 {
509     DBG_ASSERT(!xUnoControlModel.is(), "model already exists");
510 
511     aUnoControlModelTypeName = rModelName;
512 
513     uno::Reference< awt::XControlModel >   xModel;
514     if (aUnoControlModelTypeName.Len() && rxSFac.is() )
515     {
516         xModel = uno::Reference< awt::XControlModel >(rxSFac->createInstance(
517             aUnoControlModelTypeName), uno::UNO_QUERY);
518 
519         if (xModel.is())
520             SetChanged();
521     }
522 
523     SetUnoControlModel(xModel);
524 }
525 
SetUnoControlModel(const uno::Reference<awt::XControlModel> & xModel)526 void SdrUnoObj::SetUnoControlModel( const uno::Reference< awt::XControlModel >& xModel)
527 {
528     if (xUnoControlModel.is())
529     {
530         uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
531         if (xComp.is())
532             m_pImpl->pEventListener->StopListening(xComp);
533     }
534 
535     xUnoControlModel = xModel;
536 
537     // control model muss servicename des controls enthalten
538     if (xUnoControlModel.is())
539     {
540         uno::Reference< beans::XPropertySet > xSet(xUnoControlModel, uno::UNO_QUERY);
541         if (xSet.is())
542         {
543             uno::Any aValue( xSet->getPropertyValue(String("DefaultControl", gsl_getSystemTextEncoding())) );
544             ::rtl::OUString aStr;
545             if( aValue >>= aStr )
546                 aUnoControlTypeName = String(aStr);
547         }
548 
549         uno::Reference< lang::XComponent > xComp(xUnoControlModel, uno::UNO_QUERY);
550         if (xComp.is())
551             m_pImpl->pEventListener->StartListening(xComp);
552     }
553 
554     // invalidate all ViewObject contacts
555     ViewContactOfUnoControl* pVC = NULL;
556     if ( impl_getViewContact( pVC ) )
557     {
558         // flushViewObjectContacts() removes all existing VOCs for the local DrawHierarchy. This
559         // is always allowed since they will be re-created on demand (and with the changed model)
560         GetViewContact().flushViewObjectContacts(true);
561     }
562 }
563 
564 //------------------------------------------------------------------------
GetUnoControl(const SdrView & _rView,const OutputDevice & _rOut) const565 uno::Reference< awt::XControl > SdrUnoObj::GetUnoControl(const SdrView& _rView, const OutputDevice& _rOut) const
566 {
567     uno::Reference< awt::XControl > xControl;
568 
569     SdrPageView* pPageView = _rView.GetSdrPageView();
570     OSL_ENSURE( GetPage() == pPageView->GetPage(), "SdrUnoObj::GetUnoControl: This object is not displayed in that particular view!" );
571     if ( GetPage() != pPageView->GetPage() )
572         return NULL;
573 
574     SdrPageWindow* pPageWindow = pPageView ? pPageView->FindPageWindow( _rOut ) : NULL;
575     OSL_ENSURE( pPageWindow, "SdrUnoObj::GetUnoControl: did not find my SdrPageWindow!" );
576     if ( !pPageWindow )
577         return NULL;
578 
579     ViewObjectContact& rViewObjectContact( GetViewContact().GetViewObjectContact( pPageWindow->GetObjectContact() ) );
580     ViewObjectContactOfUnoControl* pUnoContact = dynamic_cast< ViewObjectContactOfUnoControl* >( &rViewObjectContact );
581     OSL_ENSURE( pUnoContact, "SdrUnoObj::GetUnoControl: wrong contact type!" );
582     if ( pUnoContact )
583         xControl = pUnoContact->getControl();
584 
585     return xControl;
586 }
587 
588 //------------------------------------------------------------------------
GetTemporaryControlForWindow(const Window & _rWindow,uno::Reference<awt::XControlContainer> & _inout_ControlContainer) const589 uno::Reference< awt::XControl > SdrUnoObj::GetTemporaryControlForWindow(
590     const Window& _rWindow, uno::Reference< awt::XControlContainer >& _inout_ControlContainer ) const
591 {
592     uno::Reference< awt::XControl > xControl;
593 
594     ViewContactOfUnoControl* pVC = NULL;
595     if ( impl_getViewContact( pVC ) )
596         xControl = pVC->getTemporaryControlForWindow( _rWindow, _inout_ControlContainer );
597 
598     return xControl;
599 }
600 
601 //------------------------------------------------------------------------
impl_getViewContact(ViewContactOfUnoControl * & _out_rpContact) const602 bool SdrUnoObj::impl_getViewContact( ViewContactOfUnoControl*& _out_rpContact ) const
603 {
604     ViewContact& rViewContact( GetViewContact() );
605     _out_rpContact = dynamic_cast< ViewContactOfUnoControl* >( &rViewContact );
606     DBG_ASSERT( _out_rpContact, "SdrUnoObj::impl_getViewContact: could not find my ViewContact!" );
607     return ( _out_rpContact != NULL );
608 }
609 
610 //------------------------------------------------------------------------
CreateObjectSpecificViewContact()611 ::sdr::contact::ViewContact* SdrUnoObj::CreateObjectSpecificViewContact()
612 {
613   return new ::sdr::contact::ViewContactOfUnoControl( *this );
614 }
615 
616 // -----------------------------------------------------------------------------
617 // eof
618