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 #include "precompiled_reportdesign.hxx"
24 #include "propbrw.hxx"
25 #include "RptObject.hxx"
26 #include "ReportController.hxx"
27 #include <cppuhelper/component_context.hxx>
28 #ifndef _REPORT_DLGRESID_HRC
29 #include <RptResId.hrc>
30 #endif
31 #ifndef _RPTUI_SLOTID_HRC_
32 #include "rptui_slotid.hrc"
33 #endif
34 #include <tools/debug.hxx>
35 #include <com/sun/star/awt/XLayoutConstrains.hpp>
36 #include <com/sun/star/inspection/ObjectInspector.hpp>
37 #include <com/sun/star/inspection/DefaultHelpProvider.hpp>
38 #ifndef _SVX_SVXIDS_HRC
39 #include <svx/svxids.hrc>
40 #endif
41 #include <vcl/stdtext.hxx>
42 #include <svx/svdview.hxx>
43 #include <svx/svdogrp.hxx>
44 #include <svx/svdpage.hxx>
45 #include <svx/svditer.hxx>
46 
47 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
48 #include <toolkit/unohlp.hxx>
49 #endif
50 #include <comphelper/property.hxx>
51 #include <comphelper/namecontainer.hxx>
52 #include <comphelper/composedprops.hxx>
53 #include <comphelper/stl_types.hxx>
54 #include <comphelper/types.hxx>
55 #include <comphelper/sequence.hxx>
56 #include <com/sun/star/beans/PropertyValue.hpp>
57 #include <com/sun/star/awt/PosSize.hpp>
58 #include <com/sun/star/lang/XServiceInfo.hpp>
59 #include <com/sun/star/report/inspection/DefaultComponentInspectorModel.hpp>
60 #include <comphelper/processfactory.hxx>
61 #include "SectionView.hxx"
62 #include "ReportSection.hxx"
63 #ifndef REPORTDESIGN_SHARED_UISTRINGS_HRC
64 #include "uistrings.hrc"
65 #endif
66 #include "DesignView.hxx"
67 #include "ViewsWindow.hxx"
68 #include "UITools.hxx"
69 #include <unotools/confignode.hxx>
70 
71 namespace rptui
72 {
73 #define STD_WIN_SIZE_X  300
74 #define STD_WIN_SIZE_Y  350
75 
76 using namespace ::com::sun::star;
77 using namespace uno;
78 using namespace lang;
79 using namespace frame;
80 using namespace beans;
81 using namespace container;
82 using namespace ::comphelper;
83 
84 //----------------------------------------------------------------------------
85 //-----------------------------------------------------------------------
86 namespace
87 {
88     static bool lcl_shouldEnableHelpSection( const Reference< XMultiServiceFactory >& _rxFactory )
89     {
90         const ::rtl::OUString sConfigName( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.ReportDesign/PropertyBrowser/" ) );
91         const ::rtl::OUString sPropertyName( RTL_CONSTASCII_USTRINGPARAM( "DirectHelp" ) );
92 
93         ::utl::OConfigurationTreeRoot aConfiguration(
94             ::utl::OConfigurationTreeRoot::createWithServiceFactory( _rxFactory, sConfigName ) );
95 
96         bool bEnabled = false;
97         OSL_VERIFY( aConfiguration.getNodeValue( sPropertyName ) >>= bEnabled );
98         return bEnabled;
99     }
100 }
101 //-----------------------------------------------------------------------
102 //============================================================================
103 // PropBrw
104 //============================================================================
105 
106 DBG_NAME( rpt_PropBrw )
107 
108 //----------------------------------------------------------------------------
109 
110 PropBrw::PropBrw(const Reference< XMultiServiceFactory >&	_xORB,Window* pParent,ODesignView*  _pDesignView)
111 		  :DockingWindow(pParent,WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_3DLOOK|WB_ROLLABLE))
112           ,m_xORB(_xORB)
113           ,m_pDesignView(_pDesignView)
114 		  ,m_pView( NULL )
115 		  ,m_bInitialStateChange(sal_True)
116 {
117 	DBG_CTOR( rpt_PropBrw,NULL);
118 
119 	Size aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y);
120 	SetOutputSizePixel(aPropWinSize);
121 
122 	try
123 	{
124 		// create a frame wrapper for myself
125         m_xMeAsFrame = Reference< XFrame >(m_xORB->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Frame"))), UNO_QUERY);
126 		if (m_xMeAsFrame.is())
127 		{
128 			m_xMeAsFrame->initialize( VCLUnoHelper::GetInterface ( this ) );
129 			m_xMeAsFrame->setName(::rtl::OUString::createFromAscii("report property browser"));  // change name!
130 		}
131 	}
132 	catch (Exception&)
133 	{
134 		DBG_ERROR("PropBrw::PropBrw: could not create/initialize my frame!");
135 		m_xMeAsFrame.clear();
136 	}
137 
138 	if (m_xMeAsFrame.is())
139 	{
140         Reference< XComponentContext > xOwnContext;
141 		try
142 		{
143             // our own component context
144             Reference< XPropertySet > xFactoryProperties( m_xORB, UNO_QUERY_THROW );
145             xOwnContext.set(
146                 xFactoryProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ),
147                 UNO_QUERY_THROW );
148 
149             /*uno::Reference< XComponent> xModel = new OContextHelper(m_xORB,uno::Reference< XComponent>(m_pDesignView->getController().getModel(),uno::UNO_QUERY) );
150             uno::Reference< XComponent> xDialogParentWindow = new OContextHelper(m_xORB,uno::Reference< XComponent>(VCLUnoHelper::GetInterface ( this ),uno::UNO_QUERY) );
151             uno::Reference< XComponent> xConnection = new OContextHelper(m_xORB,uno::Reference< XComponent>(m_pDesignView->getController().getConnection(),uno::UNO_QUERY) );*/
152             // a ComponentContext for the
153             ::cppu::ContextEntry_Init aHandlerContextInfo[] =
154             {
155                 ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) ), makeAny( m_pDesignView->getController().getModel() )),
156                 ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) ), makeAny( VCLUnoHelper::GetInterface ( this ) )),
157                 ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ActiveConnection" ) ), makeAny( m_pDesignView->getController().getConnection() ) ),
158             };
159             m_xInspectorContext.set(
160                 ::cppu::createComponentContext( aHandlerContextInfo, sizeof( aHandlerContextInfo ) / sizeof( aHandlerContextInfo[0] ),
161                 xOwnContext ) );
162 			// create a property browser controller
163             bool bEnableHelpSection = lcl_shouldEnableHelpSection( m_xORB );
164             Reference< inspection::XObjectInspectorModel> xInspectorModel( bEnableHelpSection
165                 ?   report::inspection::DefaultComponentInspectorModel::createWithHelpSection( m_xInspectorContext, 3, 8 )
166                 :   report::inspection::DefaultComponentInspectorModel::createDefault( m_xInspectorContext ) );
167 
168             m_xBrowserController = inspection::ObjectInspector::createWithModel(m_xInspectorContext, xInspectorModel);
169             if ( !m_xBrowserController.is() )
170             {
171                 const ::rtl::OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.inspection.ObjectInspector" ) );
172 				ShowServiceNotAvailableError(pParent, sServiceName, sal_True);
173             }
174             else
175             {
176 				m_xBrowserController->attachFrame(m_xMeAsFrame);
177 				m_xBrowserComponentWindow = m_xMeAsFrame->getComponentWindow();
178 				OSL_ENSURE(m_xBrowserComponentWindow.is(), "PropBrw::PropBrw: attached the controller, but have no component window!");
179                 if ( bEnableHelpSection )
180                 {
181                     uno::Reference< inspection::XObjectInspector > xInspector( m_xBrowserController, uno::UNO_QUERY_THROW );
182                     uno::Reference< inspection::XObjectInspectorUI > xInspectorUI( xInspector->getInspectorUI() );
183                     uno::Reference< uno::XInterface > xDefaultHelpProvider( inspection::DefaultHelpProvider::create( m_xInspectorContext, xInspectorUI ) );
184                 }
185             }
186             xFactoryProperties->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ,makeAny(xOwnContext));
187 		}
188 		catch (Exception&)
189 		{
190 			DBG_ERROR("PropBrw::PropBrw: could not create/initialize the browser controller!");
191 			try
192 			{
193 				::comphelper::disposeComponent(m_xBrowserController);
194 				::comphelper::disposeComponent(m_xBrowserComponentWindow);
195                 Reference< XPropertySet > xFactoryProperties( m_xORB, UNO_QUERY_THROW );
196                 if ( xOwnContext.is() )
197                     xFactoryProperties->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ,makeAny(xOwnContext));
198 			}
199 			catch(Exception&) { }
200 			m_xBrowserController.clear();
201 			m_xBrowserComponentWindow.clear();
202 		}
203 	}
204 
205 	if (m_xBrowserComponentWindow.is())
206 	{
207 
208 		m_xBrowserComponentWindow->setPosSize(0, 0, aPropWinSize.Width(), aPropWinSize.Height(),
209 			awt::PosSize::WIDTH | awt::PosSize::HEIGHT | awt::PosSize::X | awt::PosSize::Y);
210         Resize();
211 		m_xBrowserComponentWindow->setVisible(sal_True);
212     }
213     ::rptui::notifySystemWindow(pParent,this,::comphelper::mem_fun(&TaskPaneList::AddWindow));
214 }
215 
216 //----------------------------------------------------------------------------
217 
218 PropBrw::~PropBrw()
219 {
220 	if (m_xBrowserController.is())
221 		implDetachController();
222 
223     try
224     {
225         uno::Reference<container::XNameContainer> xName(m_xInspectorContext,uno::UNO_QUERY);
226         if ( xName.is() )
227         {
228             const ::rtl::OUString pProps[] = { ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) )
229                                             ,  ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) )
230                                             , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ActiveConnection" ) )};
231             for (size_t i = 0; i < sizeof(pProps)/sizeof(pProps[0]); ++i)
232                 xName->removeByName(pProps[i]);
233         }
234     }
235     catch(Exception&)
236     {}
237 
238     ::rptui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
239 
240 	DBG_DTOR( rpt_PropBrw,NULL);
241 }
242 // -----------------------------------------------------------------------------
243 void PropBrw::setCurrentPage(const ::rtl::OUString& _sLastActivePage)
244 {
245     m_sLastActivePage = _sLastActivePage;
246 }
247 //----------------------------------------------------------------------------
248 
249 void PropBrw::implDetachController()
250 {
251     m_sLastActivePage = getCurrentPage();
252     implSetNewObject(  );
253 
254     if ( m_xMeAsFrame.is() )
255         m_xMeAsFrame->setComponent( NULL, NULL );
256 
257     if ( m_xBrowserController.is() )
258         m_xBrowserController->attachFrame( NULL );
259 
260     m_xMeAsFrame.clear();
261     m_xBrowserController.clear();
262     m_xBrowserComponentWindow.clear();
263 }
264 //-----------------------------------------------------------------------
265 ::rtl::OUString PropBrw::getCurrentPage() const
266 {
267     ::rtl::OUString sCurrentPage;
268     try
269     {
270         if ( m_xBrowserController.is() )
271         {
272             OSL_VERIFY( m_xBrowserController->getViewData() >>= sCurrentPage );
273         }
274 
275         if ( !sCurrentPage.getLength() )
276             sCurrentPage = m_sLastActivePage;
277     }
278     catch( const Exception& )
279     {
280     	OSL_ENSURE( sal_False, "PropBrw::getCurrentPage: caught an exception while retrieving the current page!" );
281     }
282     return sCurrentPage;
283 }
284 //----------------------------------------------------------------------------
285 
286 sal_Bool PropBrw::Close()
287 {
288     m_xLastSection.clear();
289     // suspend the controller (it is allowed to veto)
290     if ( m_xMeAsFrame.is() )
291     {
292         try
293         {
294             Reference< XController > xController( m_xMeAsFrame->getController() );
295             if ( xController.is() && !xController->suspend( sal_True ) )
296                 return sal_False;
297         }
298         catch( const Exception& )
299         {
300         	OSL_ENSURE( sal_False, "FmPropBrw::Close: caught an exception while asking the controller!" );
301         }
302     }
303 	implDetachController();
304 
305     if( IsRollUp() )
306 		RollDown();
307 
308     m_pDesignView->getController().executeUnChecked(SID_PROPERTYBROWSER_LAST_PAGE,uno::Sequence< beans::PropertyValue>());
309 
310 	return sal_True;
311 }
312 
313 //----------------------------------------------------------------------------
314 
315 uno::Sequence< Reference<uno::XInterface> > PropBrw::CreateCompPropSet(const SdrMarkList& _rMarkList)
316 {
317     sal_uInt32 nMarkCount = _rMarkList.GetMarkCount();
318 	::std::vector< uno::Reference< uno::XInterface> > aSets;
319     aSets.reserve(nMarkCount);
320 
321 	for(sal_uInt32 i=0;i<nMarkCount;++i)
322 	{
323 		SdrObject* pCurrent = _rMarkList.GetMark(i)->GetMarkedSdrObj();
324 
325         ::std::auto_ptr<SdrObjListIter> pGroupIterator;
326 		if (pCurrent->IsGroupObject())
327 		{
328 			pGroupIterator.reset(new SdrObjListIter(*pCurrent->GetSubList()));
329 			pCurrent = pGroupIterator->IsMore() ? pGroupIterator->Next() : NULL;
330 		}
331 
332 		while (pCurrent)
333 		{
334 			OObjectBase* pObj = dynamic_cast<OObjectBase*>(pCurrent);
335 			if ( pObj )
336 				aSets.push_back(CreateComponentPair(pObj));
337 
338 			// next element
339 			pCurrent = pGroupIterator.get() && pGroupIterator->IsMore() ? pGroupIterator->Next() : NULL;
340 		}
341 	}
342 	Reference<uno::XInterface> *pSets = aSets.empty() ? NULL : &aSets[0];
343 	return uno::Sequence< Reference<uno::XInterface> >(pSets, aSets.size());
344 }
345 //----------------------------------------------------------------------------
346 void PropBrw::implSetNewObject( const uno::Sequence< Reference<uno::XInterface> >& _aObjects )
347 {
348     if ( m_xBrowserController.is() )
349     {
350         try
351         {
352             m_xBrowserController->inspect(uno::Sequence< Reference<uno::XInterface> >());
353             m_xBrowserController->inspect(_aObjects);
354         }
355         catch( const Exception& )
356         {
357             OSL_ENSURE( sal_False, "FmPropBrw::StateChanged: caught an exception while setting the initial page!" );
358         }
359 
360         //Resize();
361     }
362     SetText( GetHeadlineName(_aObjects) );
363 }
364 
365 //----------------------------------------------------------------------------
366 
367 ::rtl::OUString PropBrw::GetHeadlineName( const uno::Sequence< Reference<uno::XInterface> >& _aObjects )
368 {
369 	::rtl::OUString aName;
370     if ( !_aObjects.getLength() )
371     {
372         aName = String(ModuleRes(RID_STR_BRWTITLE_NO_PROPERTIES));
373     }
374 	else if ( _aObjects.getLength() == 1 )    // single selection
375 	{
376 		sal_uInt16 nResId = 0;
377 		aName = String(ModuleRes(RID_STR_BRWTITLE_PROPERTIES));
378 
379         uno::Reference< container::XNameContainer > xNameCont(_aObjects[0],uno::UNO_QUERY);
380         Reference< lang::XServiceInfo > xServiceInfo( xNameCont->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReportComponent"))), UNO_QUERY );
381         if ( xServiceInfo.is() )
382         {
383 		    if ( xServiceInfo->supportsService( SERVICE_FIXEDTEXT ) )
384 		    {
385 			    nResId = RID_STR_PROPTITLE_FIXEDTEXT;
386 		    }
387             else if ( xServiceInfo->supportsService( SERVICE_IMAGECONTROL ) )
388 		    {
389 			    nResId = RID_STR_PROPTITLE_IMAGECONTROL;
390 		    }
391 		    else if ( xServiceInfo->supportsService( SERVICE_FORMATTEDFIELD ) )
392 		    {
393 			    nResId = RID_STR_PROPTITLE_FORMATTED;
394 		    }
395             else if ( xServiceInfo->supportsService( SERVICE_SHAPE ) )
396 		    {
397 			    nResId = RID_STR_PROPTITLE_SHAPE;
398 		    }
399             else if ( xServiceInfo->supportsService( SERVICE_REPORTDEFINITION ) )
400 		    {
401 			    nResId = RID_STR_PROPTITLE_REPORT;
402 		    }
403             else if ( xServiceInfo->supportsService( SERVICE_SECTION ) )
404 		    {
405 			    nResId = RID_STR_PROPTITLE_SECTION;
406 		    }
407             else if ( xServiceInfo->supportsService( SERVICE_FUNCTION ) )
408 		    {
409 			    nResId = RID_STR_PROPTITLE_FUNCTION;
410 		    }
411             else if ( xServiceInfo->supportsService( SERVICE_GROUP ) )
412 		    {
413 			    nResId = RID_STR_PROPTITLE_GROUP;
414 		    }
415             else if ( xServiceInfo->supportsService( SERVICE_FIXEDLINE ) )
416 		    {
417 			    nResId = RID_STR_PROPTITLE_FIXEDLINE;
418 		    }
419             else
420             {
421                 OSL_ENSURE(0,"Unknown service name!");
422 			    nResId = RID_STR_CLASS_FORMATTEDFIELD;
423             }
424 
425 		    if (nResId)
426 		    {
427 			    aName += String(ModuleRes(nResId));
428 		    }
429 	    }
430     }
431 	else    // multiselection
432 	{
433 		aName = String(ModuleRes(RID_STR_BRWTITLE_PROPERTIES));
434 		aName += String(ModuleRes(RID_STR_BRWTITLE_MULTISELECT));
435 	}
436 
437 	return aName;
438 }
439 // -----------------------------------------------------------------------------
440 uno::Reference< uno::XInterface> PropBrw::CreateComponentPair(OObjectBase* _pObj)
441 {
442     _pObj->initializeOle();
443     return CreateComponentPair(_pObj->getAwtComponent(),_pObj->getReportComponent());
444 }
445 //----------------------------------------------------------------------------
446 uno::Reference< uno::XInterface> PropBrw::CreateComponentPair(const uno::Reference< uno::XInterface>& _xFormComponent
447                                                               ,const uno::Reference< uno::XInterface>& _xReportComponent)
448 {
449     uno::Reference< container::XNameContainer > xNameCont = ::comphelper::NameContainer_createInstance(::getCppuType(static_cast<Reference<XInterface> * >(NULL)));
450     xNameCont->insertByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FormComponent")),uno::makeAny(_xFormComponent));
451     xNameCont->insertByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReportComponent")),uno::makeAny(_xReportComponent));
452     xNameCont->insertByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RowSet"))
453             ,uno::makeAny(uno::Reference< uno::XInterface>(m_pDesignView->getController().getRowSet())));
454 
455     return xNameCont.get();
456 }
457 // -----------------------------------------------------------------------------
458 ::Size PropBrw::getMinimumSize() const
459 {
460     ::Size aSize;
461     Reference< awt::XLayoutConstrains > xLayoutConstrains( m_xBrowserController, UNO_QUERY );
462 	if( xLayoutConstrains.is() )
463 	{
464 		awt::Size aMinSize = xLayoutConstrains->getMinimumSize();
465 		aMinSize.Height += 4;
466 		aMinSize.Width += 4;
467 		aSize.setHeight( aMinSize.Height );
468 		aSize.setWidth( aMinSize.Width );
469 	}
470     return aSize;
471 }
472 //----------------------------------------------------------------------------
473 void PropBrw::Resize()
474 {
475 	Window::Resize();
476 
477     Reference< awt::XLayoutConstrains > xLayoutConstrains( m_xBrowserController, UNO_QUERY );
478 	if( xLayoutConstrains.is() )
479 	{
480         ::Size aMinSize = getMinimumSize();
481 		SetMinOutputSizePixel( aMinSize );
482         ::Size aSize = GetOutputSizePixel();
483 		sal_Bool bResize = sal_False;
484 		if( aSize.Width() < aMinSize.Width() )
485 		{
486 			aSize.setWidth( aMinSize.Width() );
487 			bResize = sal_True;
488 		}
489 		if( aSize.Height() < aMinSize.Height() )
490 		{
491 			aSize.setHeight( aMinSize.Height() );
492 			bResize = sal_True;
493 		}
494 		if( bResize )
495 			SetOutputSizePixel( aSize );
496 	}
497 	// adjust size
498 	if (m_xBrowserComponentWindow.is())
499 	{
500        	Size  aSize = GetOutputSizePixel();
501 		m_xBrowserComponentWindow->setPosSize(0, 0, aSize.Width(), aSize.Height(),
502 			awt::PosSize::WIDTH | awt::PosSize::HEIGHT);
503 	}
504 }
505 //----------------------------------------------------------------------------
506 void PropBrw::Update( OSectionView* pNewView )
507 {
508     try
509     {
510         if ( m_pView )
511         {
512             EndListening( *(m_pView->GetModel()) );
513             m_pView = NULL;
514         }
515 
516         // set focus on initialization
517         if ( m_bInitialStateChange )
518         {
519             // if we're just newly created, we want to have the focus
520 		    PostUserEvent( LINK( this, PropBrw, OnAsyncGetFocus ) );
521             m_bInitialStateChange = sal_False;
522             // and additionally, we want to show the page which was active during
523             // our previous incarnation
524             if ( m_sLastActivePage.getLength() && m_xBrowserController.is() )
525             {
526                 try
527                 {
528                     m_xBrowserController->restoreViewData( makeAny( m_sLastActivePage ) );
529                 }
530                 catch( const Exception& )
531                 {
532                     OSL_ENSURE( sal_False, "FmPropBrw::StateChanged: caught an exception while setting the initial page!" );
533                 }
534             }
535 		}
536 
537         if ( !pNewView )
538             return;
539         else
540             m_pView = pNewView;
541 
542         uno::Sequence< Reference<uno::XInterface> > aMarkedObjects;
543         OViewsWindow* pViews = m_pView->getReportSection()->getSectionWindow()->getViewsWindow();
544         const sal_uInt16 nSectionCount = pViews->getSectionCount();
545         for (sal_uInt16 i = 0; i < nSectionCount; ++i)
546         {
547             ::boost::shared_ptr<OSectionWindow> pSectionWindow = pViews->getSectionWindow(i);
548             if ( pSectionWindow )
549             {
550                 const SdrMarkList& rMarkList = pSectionWindow->getReportSection().getSectionView().GetMarkedObjectList();
551                 aMarkedObjects = ::comphelper::concatSequences(aMarkedObjects,CreateCompPropSet( rMarkList ));
552             }
553         }
554 
555         if ( aMarkedObjects.getLength() ) // multiple selection
556         {
557             m_xLastSection.clear();
558             implSetNewObject( aMarkedObjects );
559         }
560         else if ( m_xLastSection != m_pView->getReportSection()->getSection() )
561         {
562             uno::Reference< uno::XInterface> xTemp(m_pView->getReportSection()->getSection());
563             m_xLastSection = xTemp;
564             uno::Reference< container::XNameContainer > xNameCont = ::comphelper::NameContainer_createInstance(::getCppuType(static_cast<Reference<XInterface> * >(NULL)));
565             xNameCont->insertByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReportComponent")),uno::makeAny(xTemp));
566             xTemp = xNameCont;
567 
568 			implSetNewObject( uno::Sequence< uno::Reference< uno::XInterface> >(&xTemp,1) );
569         }
570 
571         StartListening( *(m_pView->GetModel()) );
572     }
573     catch ( Exception& )
574     {
575         DBG_ERROR( "PropBrw::Update: Exception occurred!" );
576     }
577 }
578 //----------------------------------------------------------------------------
579 void PropBrw::Update( const uno::Reference< uno::XInterface>& _xReportComponent)
580 {
581     if ( m_xLastSection != _xReportComponent )
582     {
583         m_xLastSection = _xReportComponent;
584         try
585         {
586 		    if ( m_pView )
587             {
588                 EndListening( *(m_pView->GetModel()) );
589                 m_pView = NULL;
590             } // if ( m_pView )
591 
592             uno::Reference< uno::XInterface> xTemp(CreateComponentPair(_xReportComponent,_xReportComponent));
593 		    implSetNewObject( uno::Sequence< uno::Reference< uno::XInterface> >(&xTemp,1) );
594 	    }
595 	    catch ( Exception& )
596         {
597             DBG_ERROR( "PropBrw::Update: Exception occurred!" );
598         }
599     }
600 }
601 //-----------------------------------------------------------------------
602 IMPL_LINK( PropBrw, OnAsyncGetFocus, void*,  )
603 {
604 	if (m_xBrowserComponentWindow.is())
605 		m_xBrowserComponentWindow->setFocus();
606 	return 0L;
607 }
608 //----------------------------------------------------------------------------
609 void PropBrw::LoseFocus()
610 {
611 	DockingWindow::LoseFocus();
612     m_pDesignView->getController().InvalidateAll();
613 }
614 //----------------------------------------------------------------------------
615 }
616