xref: /AOO41X/main/basctl/source/dlged/propbrw.cxx (revision 31598a226906602f93ad246cbee896e3caca5f8f)
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_basctl.hxx"
26 
27 
28 #include "propbrw.hxx"
29 #include "dlgedobj.hxx"
30 
31 #include "basidesh.hxx"
32 #include <iderid.hxx>
33 
34 #ifndef _BASCTL_DLGRESID_HRC
35 #include <dlgresid.hrc>
36 #endif
37 #include <tools/debug.hxx>
38 #include <tools/diagnose_ex.h>
39 #include <sfx2/bindings.hxx>
40 #include <sfx2/childwin.hxx>
41 #include <sfx2/objitem.hxx>
42 
43 #ifndef _SVX_SVXIDS_HRC
44 #include <svx/svxids.hrc>
45 #endif
46 #include <tools/shl.hxx>
47 #include <vcl/stdtext.hxx>
48 #include <svx/svdview.hxx>
49 #include <svx/svdogrp.hxx>
50 #include <svx/svdpage.hxx>
51 #include <svx/svditer.hxx>
52 #include <sfx2/viewsh.hxx>
53 
54 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
55 #include <toolkit/unohlp.hxx>
56 #endif
57 #include <comphelper/property.hxx>
58 #include <comphelper/composedprops.hxx>
59 #include <comphelper/stl_types.hxx>
60 #include <comphelper/types.hxx>
61 #include <com/sun/star/beans/PropertyValue.hpp>
62 #include <com/sun/star/awt/PosSize.hpp>
63 #include <com/sun/star/lang/XServiceInfo.hpp>
64 #include <com/sun/star/inspection/XObjectInspector.hpp>
65 #include <comphelper/processfactory.hxx>
66 #include <cppuhelper/component_context.hxx>
67 
68 #include <sfx2/dispatch.hxx>
69 #include <sfx2/viewfrm.hxx>
70 
71 using namespace ::com::sun::star;
72 using namespace ::com::sun::star::uno;
73 using namespace ::com::sun::star::lang;
74 using namespace ::com::sun::star::frame;
75 using namespace ::com::sun::star::beans;
76 using namespace ::com::sun::star::container;
77 using namespace ::comphelper;
78 
79 //============================================================================
80 // PropBrwMgr
81 //============================================================================
82 
SFX_IMPL_FLOATINGWINDOW(PropBrwMgr,SID_SHOW_PROPERTYBROWSER)83 SFX_IMPL_FLOATINGWINDOW(PropBrwMgr, SID_SHOW_PROPERTYBROWSER)
84 
85 //----------------------------------------------------------------------------
86 
87 PropBrwMgr::PropBrwMgr( Window* _pParent, sal_uInt16 nId,
88                         SfxBindings *pBindings, SfxChildWinInfo* pInfo)
89               :SfxChildWindow( _pParent, nId )
90 {
91     // set current selection
92     SfxViewShell* pShell = SfxViewShell::Current();
93     pWindow = new PropBrw(
94         ::comphelper::getProcessServiceFactory(),
95         pBindings,
96         this,
97         _pParent,
98         pShell ? pShell->GetCurrentDocument() : Reference< XModel >()
99         );
100 
101     eChildAlignment = SFX_ALIGN_NOALIGNMENT;
102     ((SfxFloatingWindow*)pWindow)->Initialize( pInfo );
103 
104     ((PropBrw*)pWindow)->Update( pShell );
105 }
106 
107 //----------------------------------------------------------------------------
Update(const SfxViewShell * _pShell)108 void PropBrw::Update( const SfxViewShell* _pShell )
109 {
110     const BasicIDEShell* pBasicIDEShell = dynamic_cast< const BasicIDEShell* >( _pShell );
111     OSL_ENSURE( pBasicIDEShell || !_pShell, "PropBrw::Update: invalid shell!" );
112     if ( pBasicIDEShell )
113     {
114         ImplUpdate( pBasicIDEShell->GetCurrentDocument(), pBasicIDEShell->GetCurDlgView() );
115     }
116     else if ( _pShell )
117     {
118         ImplUpdate( NULL, _pShell->GetDrawView() );
119     }
120     else
121     {
122         ImplUpdate( NULL, NULL );
123     }
124 }
125 
126 //----------------------------------------------------------------------------
127 
128 const long STD_WIN_SIZE_X = 300;
129 const long STD_WIN_SIZE_Y = 350;
130 
131 const long STD_MIN_SIZE_X = 250;
132 const long STD_MIN_SIZE_Y = 250;
133 
134 const long STD_WIN_POS_X = 50;
135 const long STD_WIN_POS_Y = 50;
136 const long WIN_BORDER = 2;
137 const long MIN_WIN_SIZE_X = 50;
138 const long MIN_WIN_SIZE_Y = 50;
139 
140 //----------------------------------------------------------------------------
141 
142 //============================================================================
143 // PropBrw
144 //============================================================================
145 
DBG_NAME(PropBrw)146 DBG_NAME(PropBrw)
147 
148 //----------------------------------------------------------------------------
149 
150 PropBrw::PropBrw( const Reference< XMultiServiceFactory >& _xORB, SfxBindings* _pBindings, PropBrwMgr* _pMgr, Window* _pParent,
151             const Reference< XModel >& _rxContextDocument )
152     :SfxFloatingWindow( _pBindings, _pMgr, _pParent, WinBits( WB_STDMODELESS | WB_SIZEABLE | WB_3DLOOK | WB_ROLLABLE ) )
153     ,m_bInitialStateChange(sal_True)
154     ,m_xORB(_xORB)
155     ,m_xContextDocument( _rxContextDocument )
156     ,pView( NULL )
157 {
158     DBG_CTOR(PropBrw,NULL);
159 
160     Size aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y);
161     SetMinOutputSizePixel(Size(STD_MIN_SIZE_X,STD_MIN_SIZE_Y));
162     SetOutputSizePixel(aPropWinSize);
163 
164     try
165     {
166         // create a frame wrapper for myself
167         m_xMeAsFrame = Reference< XFrame >(m_xORB->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.Frame")), UNO_QUERY);
168         if (m_xMeAsFrame.is())
169         {
170             m_xMeAsFrame->initialize( VCLUnoHelper::GetInterface ( this ) );
171             m_xMeAsFrame->setName(::rtl::OUString::createFromAscii("form property browser"));  // change name!
172         }
173     }
174     catch (Exception&)
175     {
176         DBG_ERROR("PropBrw::PropBrw: could not create/initialize my frame!");
177         m_xMeAsFrame.clear();
178     }
179 
180     ImplReCreateController();
181 }
182 
183 //----------------------------------------------------------------------------
184 
ImplReCreateController()185 void PropBrw::ImplReCreateController()
186 {
187     OSL_PRECOND( m_xMeAsFrame.is(), "PropBrw::ImplCreateController: no frame for myself!" );
188     if ( !m_xMeAsFrame.is() )
189         return;
190 
191     if ( m_xBrowserController.is() )
192         ImplDestroyController();
193 
194     try
195     {
196         Reference< XPropertySet > xFactoryProperties( m_xORB, UNO_QUERY_THROW );
197         Reference< XComponentContext > xOwnContext(
198             xFactoryProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ),
199             UNO_QUERY_THROW );
200 
201         // a ComponentContext for the
202         ::cppu::ContextEntry_Init aHandlerContextInfo[] =
203         {
204             ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) ), makeAny( VCLUnoHelper::GetInterface ( this ) ) ),
205             ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) ), makeAny( m_xContextDocument ) )
206         };
207         Reference< XComponentContext > xInspectorContext(
208             ::cppu::createComponentContext( aHandlerContextInfo, sizeof( aHandlerContextInfo ) / sizeof( aHandlerContextInfo[0] ),
209             xOwnContext ) );
210 
211         // create a property browser controller
212         Reference< XMultiComponentFactory > xFactory( xInspectorContext->getServiceManager(), UNO_QUERY_THROW );
213         static const ::rtl::OUString s_sControllerServiceName = ::rtl::OUString::createFromAscii("com.sun.star.awt.PropertyBrowserController");
214         m_xBrowserController = Reference< XPropertySet >(
215             xFactory->createInstanceWithContext( s_sControllerServiceName, xInspectorContext ), UNO_QUERY
216         );
217         if ( !m_xBrowserController.is() )
218         {
219             ShowServiceNotAvailableError( GetParent(), s_sControllerServiceName, sal_True );
220         }
221         else
222         {
223             Reference< XController > xAsXController( m_xBrowserController, UNO_QUERY );
224             DBG_ASSERT(xAsXController.is(), "PropBrw::PropBrw: invalid controller object!");
225             if (!xAsXController.is())
226             {
227                 ::comphelper::disposeComponent(m_xBrowserController);
228                 m_xBrowserController.clear();
229             }
230             else
231             {
232                 xAsXController->attachFrame(m_xMeAsFrame);
233                 m_xBrowserComponentWindow = m_xMeAsFrame->getComponentWindow();
234                 DBG_ASSERT(m_xBrowserComponentWindow.is(), "PropBrw::PropBrw: attached the controller, but have no component window!");
235             }
236         }
237 
238         Point aPropWinPos = Point( WIN_BORDER, WIN_BORDER );
239         Size  aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y);
240         aPropWinSize.Width() -= (2*WIN_BORDER);
241         aPropWinSize.Height() -= (2*WIN_BORDER);
242 
243         if ( m_xBrowserComponentWindow.is() )
244         {
245             m_xBrowserComponentWindow->setPosSize(aPropWinPos.X(), aPropWinPos.Y(), aPropWinSize.Width(), aPropWinSize.Height(),
246                 ::com::sun::star::awt::PosSize::WIDTH | ::com::sun::star::awt::PosSize::HEIGHT |
247                 ::com::sun::star::awt::PosSize::X | ::com::sun::star::awt::PosSize::Y);
248             m_xBrowserComponentWindow->setVisible(sal_True);
249         }
250     }
251     catch (Exception&)
252     {
253         DBG_ERROR("PropBrw::PropBrw: could not create/initialize the browser controller!");
254         try
255         {
256             ::comphelper::disposeComponent(m_xBrowserController);
257             ::comphelper::disposeComponent(m_xBrowserComponentWindow);
258         }
259         catch(Exception&)
260         {
261         }
262 
263         m_xBrowserController.clear();
264         m_xBrowserComponentWindow.clear();
265     }
266 
267     Resize();
268 }
269 
270 //----------------------------------------------------------------------------
271 
~PropBrw()272 PropBrw::~PropBrw()
273 {
274     if ( m_xBrowserController.is() )
275         ImplDestroyController();
276 
277     DBG_DTOR(PropBrw,NULL);
278 }
279 
280 //----------------------------------------------------------------------------
281 
ImplDestroyController()282 void PropBrw::ImplDestroyController()
283 {
284     implSetNewObject( Reference< XPropertySet >() );
285 
286     if ( m_xMeAsFrame.is() )
287         m_xMeAsFrame->setComponent( NULL, NULL );
288 
289     Reference< XController > xAsXController( m_xBrowserController, UNO_QUERY );
290     if ( xAsXController.is() )
291         xAsXController->attachFrame( NULL );
292 
293     try
294     {
295         ::comphelper::disposeComponent( m_xBrowserController );
296     }
297     catch( const Exception& )
298     {
299         DBG_UNHANDLED_EXCEPTION();
300     }
301 
302     m_xBrowserController.clear();
303 }
304 
305 //----------------------------------------------------------------------------
306 
Close()307 sal_Bool PropBrw::Close()
308 {
309     ImplDestroyController();
310 
311     if( IsRollUp() )
312         RollDown();
313 
314     sal_Bool bClose = SfxFloatingWindow::Close();
315 
316     return bClose;
317 }
318 
319 //----------------------------------------------------------------------------
320 Sequence< Reference< XInterface > >
CreateMultiSelectionSequence(const SdrMarkList & _rMarkList)321     PropBrw::CreateMultiSelectionSequence( const SdrMarkList& _rMarkList )
322 {
323     Sequence< Reference< XInterface > > aSeq;
324     InterfaceArray aInterfaces;
325 
326     sal_uInt32 nMarkCount = _rMarkList.GetMarkCount();
327     for( sal_uInt32 i = 0 ; i < nMarkCount ; i++ )
328     {
329         SdrObject* pCurrent = _rMarkList.GetMark(i)->GetMarkedSdrObj();
330 
331         SdrObjListIter* pGroupIterator = NULL;
332         if (pCurrent->IsGroupObject())
333         {
334             pGroupIterator = new SdrObjListIter(*pCurrent->GetSubList());
335             pCurrent = pGroupIterator->IsMore() ? pGroupIterator->Next() : NULL;
336         }
337 
338         while (pCurrent)
339         {
340             DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pCurrent);
341             if (pDlgEdObj)
342             {
343                 Reference< XInterface > xControlInterface(pDlgEdObj->GetUnoControlModel(), UNO_QUERY);
344                 if (xControlInterface.is())
345                     aInterfaces.push_back(xControlInterface);
346             }
347 
348             // next element
349             pCurrent = pGroupIterator && pGroupIterator->IsMore() ? pGroupIterator->Next() : NULL;
350         }
351         if (pGroupIterator)
352             delete pGroupIterator;
353     }
354 
355     sal_Int32 nCount = aInterfaces.size();
356     aSeq.realloc( nCount );
357     Reference< XInterface >* pInterfaces = aSeq.getArray();
358     for( sal_Int32 i = 0 ; i < nCount ; i++ )
359         pInterfaces[i] = aInterfaces[i];
360 
361     return aSeq;
362 }
363 
364 //----------------------------------------------------------------------------
implSetNewObjectSequence(const Sequence<Reference<XInterface>> & _rObjectSeq)365 void PropBrw::implSetNewObjectSequence
366     ( const Sequence< Reference< XInterface > >& _rObjectSeq )
367 {
368     Reference< inspection::XObjectInspector > xObjectInspector(m_xBrowserController, UNO_QUERY);
369     if ( xObjectInspector.is() )
370     {
371         xObjectInspector->inspect( _rObjectSeq );
372 
373         ::rtl::OUString aText = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_PROPERTIES)));
374         aText += ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_MULTISELECT)));
375         SetText( aText );
376     }
377 }
378 
379 //----------------------------------------------------------------------------
380 
implSetNewObject(const Reference<XPropertySet> & _rxObject)381 void PropBrw::implSetNewObject( const Reference< XPropertySet >& _rxObject )
382 {
383     if ( m_xBrowserController.is() )
384     {
385         m_xBrowserController->setPropertyValue(
386             ::rtl::OUString::createFromAscii( "IntrospectedObject" ),
387             makeAny( _rxObject )
388         );
389 
390         // set the new title according to the selected object
391         SetText( GetHeadlineName( _rxObject ) );
392     }
393 }
394 
395 //----------------------------------------------------------------------------
396 
GetHeadlineName(const Reference<XPropertySet> & _rxObject)397 ::rtl::OUString PropBrw::GetHeadlineName( const Reference< XPropertySet >& _rxObject )
398 {
399     ::rtl::OUString aName;
400     Reference< lang::XServiceInfo > xServiceInfo( _rxObject, UNO_QUERY );
401 
402     if (xServiceInfo.is())    // single selection
403     {
404         sal_uInt16 nResId = 0;
405         aName = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_PROPERTIES)));
406 
407         if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ) )
408         {
409             nResId = RID_STR_CLASS_DIALOG;
410         }
411         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlButtonModel" ) ) ) )
412         {
413             nResId = RID_STR_CLASS_BUTTON;
414         }
415         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlRadioButtonModel" ) ) ) )
416         {
417             nResId = RID_STR_CLASS_RADIOBUTTON;
418         }
419         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlCheckBoxModel" ) ) ) )
420         {
421             nResId = RID_STR_CLASS_CHECKBOX;
422         }
423         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlListBoxModel" ) ) ) )
424         {
425             nResId = RID_STR_CLASS_LISTBOX;
426         }
427         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlComboBoxModel" ) ) ) )
428         {
429             nResId = RID_STR_CLASS_COMBOBOX;
430         }
431         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlGroupBoxModel" ) ) ) )
432         {
433             nResId = RID_STR_CLASS_GROUPBOX;
434         }
435         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlEditModel" ) ) ) )
436         {
437             nResId = RID_STR_CLASS_EDIT;
438         }
439         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFixedTextModel" ) ) ) )
440         {
441             nResId = RID_STR_CLASS_FIXEDTEXT;
442         }
443         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlImageControlModel" ) ) ) )
444         {
445             nResId = RID_STR_CLASS_IMAGECONTROL;
446         }
447         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlProgressBarModel" ) ) ) )
448         {
449             nResId = RID_STR_CLASS_PROGRESSBAR;
450         }
451         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlScrollBarModel" ) ) ) )
452         {
453             nResId = RID_STR_CLASS_SCROLLBAR;
454         }
455         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFixedLineModel" ) ) ) )
456         {
457             nResId = RID_STR_CLASS_FIXEDLINE;
458         }
459         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDateFieldModel" ) ) ) )
460         {
461             nResId = RID_STR_CLASS_DATEFIELD;
462         }
463         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlTimeFieldModel" ) ) ) )
464         {
465             nResId = RID_STR_CLASS_TIMEFIELD;
466         }
467         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlNumericFieldModel" ) ) ) )
468         {
469             nResId = RID_STR_CLASS_NUMERICFIELD;
470         }
471         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlCurrencyFieldModel" ) ) ) )
472         {
473             nResId = RID_STR_CLASS_CURRENCYFIELD;
474         }
475         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFormattedFieldModel" ) ) ) )
476         {
477             nResId = RID_STR_CLASS_FORMATTEDFIELD;
478         }
479         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlPatternFieldModel" ) ) ) )
480         {
481             nResId = RID_STR_CLASS_PATTERNFIELD;
482         }
483         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFileControlModel" ) ) ) )
484         {
485             nResId = RID_STR_CLASS_FILECONTROL;
486         }
487         else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.tree.TreeControlModel" ) ) ) )
488         {
489             nResId = RID_STR_CLASS_TREECONTROL;
490         }
491         else
492         {
493             nResId = RID_STR_CLASS_CONTROL;
494         }
495 
496         if (nResId)
497         {
498             aName += ::rtl::OUString( String(IDEResId(nResId)) );
499         }
500     }
501     else if (!_rxObject.is())    // no properties
502     {
503         aName = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_NO_PROPERTIES)));
504     }
505     // #i73075 Handled in implSetNewObjectSequence
506     //else    // multiselection
507     //{
508     //  aName = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_PROPERTIES)));
509     //  aName += ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_MULTISELECT)));
510     //}
511 
512     return aName;
513 }
514 
515 //----------------------------------------------------------------------------
516 
FillInfo(SfxChildWinInfo & rInfo) const517 void PropBrw::FillInfo( SfxChildWinInfo& rInfo ) const
518 {
519     rInfo.bVisible = sal_False;
520 }
521 
522 //----------------------------------------------------------------------------
523 
Resize()524 void PropBrw::Resize()
525 {
526     SfxFloatingWindow::Resize();
527 
528     // adjust size
529     Size aSize_ = GetOutputSizePixel();
530     Size aPropWinSize( aSize_ );
531     aPropWinSize.Width() -= (2*WIN_BORDER);
532     aPropWinSize.Height() -= (2*WIN_BORDER);
533 
534     if (m_xBrowserComponentWindow.is())
535     {
536         m_xBrowserComponentWindow->setPosSize(0, 0, aPropWinSize.Width(), aPropWinSize.Height(),
537             ::com::sun::star::awt::PosSize::WIDTH | ::com::sun::star::awt::PosSize::HEIGHT);
538     }
539 }
540 
541 //----------------------------------------------------------------------------
542 
ImplUpdate(const Reference<XModel> & _rxContextDocument,SdrView * pNewView)543 void PropBrw::ImplUpdate( const Reference< XModel >& _rxContextDocument, SdrView* pNewView )
544 {
545     Reference< XModel > xContextDocument( _rxContextDocument );
546 
547     // if we should simply "empty" ourself, assume the context document didn't change
548     if ( !pNewView )
549     {
550         OSL_ENSURE( !_rxContextDocument.is(), "PropBrw::ImplUpdate: no view, but a document?!" );
551         xContextDocument = m_xContextDocument;
552     }
553 
554     if ( xContextDocument != m_xContextDocument )
555     {
556         m_xContextDocument = xContextDocument;
557         ImplReCreateController();
558     }
559 
560     try
561     {
562         if ( pView )
563         {
564             EndListening( *(pView->GetModel()) );
565             pView = NULL;
566         }
567 
568         if ( !pNewView )
569             return;
570 
571         pView = pNewView;
572 
573         // set focus on initialization
574         if ( m_bInitialStateChange )
575         {
576             if ( m_xBrowserComponentWindow.is() )
577                 m_xBrowserComponentWindow->setFocus();
578             m_bInitialStateChange = sal_False;
579         }
580 
581         const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
582         sal_uInt32 nMarkCount = rMarkList.GetMarkCount();
583 
584         if ( nMarkCount == 0 )
585         {
586             EndListening( *(pView->GetModel()) );
587             pView = NULL;
588             implSetNewObject( NULL );
589             return;
590         }
591 
592         Reference< XPropertySet > xNewObject;
593         Sequence< Reference< XInterface > > aNewObjects;
594         if ( nMarkCount == 1 )
595         {
596             DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, rMarkList.GetMark(0)->GetMarkedSdrObj() );
597             if ( pDlgEdObj )
598             {
599                 if ( pDlgEdObj->IsGroupObject() ) // group object
600                     aNewObjects = CreateMultiSelectionSequence( rMarkList );
601                 else // single selection
602                     xNewObject = xNewObject.query( pDlgEdObj->GetUnoControlModel() );
603             }
604         }
605         else if ( nMarkCount > 1 ) // multiple selection
606         {
607             aNewObjects = CreateMultiSelectionSequence( rMarkList );
608         }
609 
610         if ( aNewObjects.getLength() )
611             implSetNewObjectSequence( aNewObjects );
612         else
613             implSetNewObject( xNewObject );
614 
615         StartListening( *(pView->GetModel()) );
616     }
617     catch ( const PropertyVetoException& ) { /* silence */ }
618     catch ( const Exception& )
619     {
620         DBG_UNHANDLED_EXCEPTION();
621     }
622 }
623 
624 //----------------------------------------------------------------------------
625