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