| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_basctl.hxx" |
| |
| |
| #include "propbrw.hxx" |
| #include "dlgedobj.hxx" |
| |
| #include "basidesh.hxx" |
| #include <iderid.hxx> |
| |
| #ifndef _BASCTL_DLGRESID_HRC |
| #include <dlgresid.hrc> |
| #endif |
| #include <tools/debug.hxx> |
| #include <tools/diagnose_ex.h> |
| #include <sfx2/bindings.hxx> |
| #include <sfx2/childwin.hxx> |
| #include <sfx2/objitem.hxx> |
| |
| #ifndef _SVX_SVXIDS_HRC |
| #include <svx/svxids.hrc> |
| #endif |
| #include <tools/shl.hxx> |
| #include <vcl/stdtext.hxx> |
| #include <svx/svdview.hxx> |
| #include <svx/svdogrp.hxx> |
| #include <svx/svdpage.hxx> |
| #include <svx/svditer.hxx> |
| #include <sfx2/viewsh.hxx> |
| |
| #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ |
| #include <toolkit/unohlp.hxx> |
| #endif |
| #include <comphelper/property.hxx> |
| #include <comphelper/composedprops.hxx> |
| #include <comphelper/stl_types.hxx> |
| #include <comphelper/types.hxx> |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #include <com/sun/star/awt/PosSize.hpp> |
| #include <com/sun/star/lang/XServiceInfo.hpp> |
| #include <com/sun/star/inspection/XObjectInspector.hpp> |
| #include <comphelper/processfactory.hxx> |
| #include <cppuhelper/component_context.hxx> |
| |
| #include <sfx2/dispatch.hxx> |
| #include <sfx2/viewfrm.hxx> |
| |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::frame; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::container; |
| using namespace ::comphelper; |
| |
| //============================================================================ |
| // PropBrwMgr |
| //============================================================================ |
| |
| SFX_IMPL_FLOATINGWINDOW(PropBrwMgr, SID_SHOW_PROPERTYBROWSER) |
| |
| //---------------------------------------------------------------------------- |
| |
| PropBrwMgr::PropBrwMgr( Window* _pParent, sal_uInt16 nId, |
| SfxBindings *pBindings, SfxChildWinInfo* pInfo) |
| :SfxChildWindow( _pParent, nId ) |
| { |
| // set current selection |
| SfxViewShell* pShell = SfxViewShell::Current(); |
| pWindow = new PropBrw( |
| ::comphelper::getProcessServiceFactory(), |
| pBindings, |
| this, |
| _pParent, |
| pShell ? pShell->GetCurrentDocument() : Reference< XModel >() |
| ); |
| |
| eChildAlignment = SFX_ALIGN_NOALIGNMENT; |
| ((SfxFloatingWindow*)pWindow)->Initialize( pInfo ); |
| |
| ((PropBrw*)pWindow)->Update( pShell ); |
| } |
| |
| //---------------------------------------------------------------------------- |
| void PropBrw::Update( const SfxViewShell* _pShell ) |
| { |
| const BasicIDEShell* pBasicIDEShell = dynamic_cast< const BasicIDEShell* >( _pShell ); |
| OSL_ENSURE( pBasicIDEShell || !_pShell, "PropBrw::Update: invalid shell!" ); |
| if ( pBasicIDEShell ) |
| { |
| ImplUpdate( pBasicIDEShell->GetCurrentDocument(), pBasicIDEShell->GetCurDlgView() ); |
| } |
| else if ( _pShell ) |
| { |
| ImplUpdate( NULL, _pShell->GetDrawView() ); |
| } |
| else |
| { |
| ImplUpdate( NULL, NULL ); |
| } |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| const long STD_WIN_SIZE_X = 300; |
| const long STD_WIN_SIZE_Y = 350; |
| |
| const long STD_MIN_SIZE_X = 250; |
| const long STD_MIN_SIZE_Y = 250; |
| |
| const long STD_WIN_POS_X = 50; |
| const long STD_WIN_POS_Y = 50; |
| const long WIN_BORDER = 2; |
| const long MIN_WIN_SIZE_X = 50; |
| const long MIN_WIN_SIZE_Y = 50; |
| |
| //---------------------------------------------------------------------------- |
| |
| //============================================================================ |
| // PropBrw |
| //============================================================================ |
| |
| DBG_NAME(PropBrw) |
| |
| //---------------------------------------------------------------------------- |
| |
| PropBrw::PropBrw( const Reference< XMultiServiceFactory >& _xORB, SfxBindings* _pBindings, PropBrwMgr* _pMgr, Window* _pParent, |
| const Reference< XModel >& _rxContextDocument ) |
| :SfxFloatingWindow( _pBindings, _pMgr, _pParent, WinBits( WB_STDMODELESS | WB_SIZEABLE | WB_3DLOOK | WB_ROLLABLE ) ) |
| ,m_bInitialStateChange(sal_True) |
| ,m_xORB(_xORB) |
| ,m_xContextDocument( _rxContextDocument ) |
| ,pView( NULL ) |
| { |
| DBG_CTOR(PropBrw,NULL); |
| |
| Size aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y); |
| SetMinOutputSizePixel(Size(STD_MIN_SIZE_X,STD_MIN_SIZE_Y)); |
| SetOutputSizePixel(aPropWinSize); |
| |
| try |
| { |
| // create a frame wrapper for myself |
| m_xMeAsFrame = Reference< XFrame >(m_xORB->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.Frame")), UNO_QUERY); |
| if (m_xMeAsFrame.is()) |
| { |
| m_xMeAsFrame->initialize( VCLUnoHelper::GetInterface ( this ) ); |
| m_xMeAsFrame->setName(::rtl::OUString::createFromAscii("form property browser")); // change name! |
| } |
| } |
| catch (Exception&) |
| { |
| DBG_ERROR("PropBrw::PropBrw: could not create/initialize my frame!"); |
| m_xMeAsFrame.clear(); |
| } |
| |
| ImplReCreateController(); |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| void PropBrw::ImplReCreateController() |
| { |
| OSL_PRECOND( m_xMeAsFrame.is(), "PropBrw::ImplCreateController: no frame for myself!" ); |
| if ( !m_xMeAsFrame.is() ) |
| return; |
| |
| if ( m_xBrowserController.is() ) |
| ImplDestroyController(); |
| |
| try |
| { |
| Reference< XPropertySet > xFactoryProperties( m_xORB, UNO_QUERY_THROW ); |
| Reference< XComponentContext > xOwnContext( |
| xFactoryProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ), |
| UNO_QUERY_THROW ); |
| |
| // a ComponentContext for the |
| ::cppu::ContextEntry_Init aHandlerContextInfo[] = |
| { |
| ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) ), makeAny( VCLUnoHelper::GetInterface ( this ) ) ), |
| ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) ), makeAny( m_xContextDocument ) ) |
| }; |
| Reference< XComponentContext > xInspectorContext( |
| ::cppu::createComponentContext( aHandlerContextInfo, sizeof( aHandlerContextInfo ) / sizeof( aHandlerContextInfo[0] ), |
| xOwnContext ) ); |
| |
| // create a property browser controller |
| Reference< XMultiComponentFactory > xFactory( xInspectorContext->getServiceManager(), UNO_QUERY_THROW ); |
| static const ::rtl::OUString s_sControllerServiceName = ::rtl::OUString::createFromAscii("com.sun.star.awt.PropertyBrowserController"); |
| m_xBrowserController = Reference< XPropertySet >( |
| xFactory->createInstanceWithContext( s_sControllerServiceName, xInspectorContext ), UNO_QUERY |
| ); |
| if ( !m_xBrowserController.is() ) |
| { |
| ShowServiceNotAvailableError( GetParent(), s_sControllerServiceName, sal_True ); |
| } |
| else |
| { |
| Reference< XController > xAsXController( m_xBrowserController, UNO_QUERY ); |
| DBG_ASSERT(xAsXController.is(), "PropBrw::PropBrw: invalid controller object!"); |
| if (!xAsXController.is()) |
| { |
| ::comphelper::disposeComponent(m_xBrowserController); |
| m_xBrowserController.clear(); |
| } |
| else |
| { |
| xAsXController->attachFrame(m_xMeAsFrame); |
| m_xBrowserComponentWindow = m_xMeAsFrame->getComponentWindow(); |
| DBG_ASSERT(m_xBrowserComponentWindow.is(), "PropBrw::PropBrw: attached the controller, but have no component window!"); |
| } |
| } |
| |
| Point aPropWinPos = Point( WIN_BORDER, WIN_BORDER ); |
| Size aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y); |
| aPropWinSize.Width() -= (2*WIN_BORDER); |
| aPropWinSize.Height() -= (2*WIN_BORDER); |
| |
| if ( m_xBrowserComponentWindow.is() ) |
| { |
| m_xBrowserComponentWindow->setPosSize(aPropWinPos.X(), aPropWinPos.Y(), aPropWinSize.Width(), aPropWinSize.Height(), |
| ::com::sun::star::awt::PosSize::WIDTH | ::com::sun::star::awt::PosSize::HEIGHT | |
| ::com::sun::star::awt::PosSize::X | ::com::sun::star::awt::PosSize::Y); |
| m_xBrowserComponentWindow->setVisible(sal_True); |
| } |
| } |
| catch (Exception&) |
| { |
| DBG_ERROR("PropBrw::PropBrw: could not create/initialize the browser controller!"); |
| try |
| { |
| ::comphelper::disposeComponent(m_xBrowserController); |
| ::comphelper::disposeComponent(m_xBrowserComponentWindow); |
| } |
| catch(Exception&) |
| { |
| } |
| |
| m_xBrowserController.clear(); |
| m_xBrowserComponentWindow.clear(); |
| } |
| |
| Resize(); |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| PropBrw::~PropBrw() |
| { |
| if ( m_xBrowserController.is() ) |
| ImplDestroyController(); |
| |
| DBG_DTOR(PropBrw,NULL); |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| void PropBrw::ImplDestroyController() |
| { |
| implSetNewObject( Reference< XPropertySet >() ); |
| |
| if ( m_xMeAsFrame.is() ) |
| m_xMeAsFrame->setComponent( NULL, NULL ); |
| |
| Reference< XController > xAsXController( m_xBrowserController, UNO_QUERY ); |
| if ( xAsXController.is() ) |
| xAsXController->attachFrame( NULL ); |
| |
| try |
| { |
| ::comphelper::disposeComponent( m_xBrowserController ); |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| |
| m_xBrowserController.clear(); |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| sal_Bool PropBrw::Close() |
| { |
| ImplDestroyController(); |
| |
| if( IsRollUp() ) |
| RollDown(); |
| |
| sal_Bool bClose = SfxFloatingWindow::Close(); |
| |
| return bClose; |
| } |
| |
| //---------------------------------------------------------------------------- |
| Sequence< Reference< XInterface > > |
| PropBrw::CreateMultiSelectionSequence( const SdrMarkList& _rMarkList ) |
| { |
| Sequence< Reference< XInterface > > aSeq; |
| InterfaceArray aInterfaces; |
| |
| sal_uInt32 nMarkCount = _rMarkList.GetMarkCount(); |
| for( sal_uInt32 i = 0 ; i < nMarkCount ; i++ ) |
| { |
| SdrObject* pCurrent = _rMarkList.GetMark(i)->GetMarkedSdrObj(); |
| |
| SdrObjListIter* pGroupIterator = NULL; |
| if (pCurrent->IsGroupObject()) |
| { |
| pGroupIterator = new SdrObjListIter(*pCurrent->GetSubList()); |
| pCurrent = pGroupIterator->IsMore() ? pGroupIterator->Next() : NULL; |
| } |
| |
| while (pCurrent) |
| { |
| DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pCurrent); |
| if (pDlgEdObj) |
| { |
| Reference< XInterface > xControlInterface(pDlgEdObj->GetUnoControlModel(), UNO_QUERY); |
| if (xControlInterface.is()) |
| aInterfaces.push_back(xControlInterface); |
| } |
| |
| // next element |
| pCurrent = pGroupIterator && pGroupIterator->IsMore() ? pGroupIterator->Next() : NULL; |
| } |
| if (pGroupIterator) |
| delete pGroupIterator; |
| } |
| |
| sal_Int32 nCount = aInterfaces.size(); |
| aSeq.realloc( nCount ); |
| Reference< XInterface >* pInterfaces = aSeq.getArray(); |
| for( sal_Int32 i = 0 ; i < nCount ; i++ ) |
| pInterfaces[i] = aInterfaces[i]; |
| |
| return aSeq; |
| } |
| |
| //---------------------------------------------------------------------------- |
| void PropBrw::implSetNewObjectSequence |
| ( const Sequence< Reference< XInterface > >& _rObjectSeq ) |
| { |
| Reference< inspection::XObjectInspector > xObjectInspector(m_xBrowserController, UNO_QUERY); |
| if ( xObjectInspector.is() ) |
| { |
| xObjectInspector->inspect( _rObjectSeq ); |
| |
| ::rtl::OUString aText = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_PROPERTIES))); |
| aText += ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_MULTISELECT))); |
| SetText( aText ); |
| } |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| void PropBrw::implSetNewObject( const Reference< XPropertySet >& _rxObject ) |
| { |
| if ( m_xBrowserController.is() ) |
| { |
| m_xBrowserController->setPropertyValue( |
| ::rtl::OUString::createFromAscii( "IntrospectedObject" ), |
| makeAny( _rxObject ) |
| ); |
| |
| // set the new title according to the selected object |
| SetText( GetHeadlineName( _rxObject ) ); |
| } |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| ::rtl::OUString PropBrw::GetHeadlineName( const Reference< XPropertySet >& _rxObject ) |
| { |
| ::rtl::OUString aName; |
| Reference< lang::XServiceInfo > xServiceInfo( _rxObject, UNO_QUERY ); |
| |
| if (xServiceInfo.is()) // single selection |
| { |
| sal_uInt16 nResId = 0; |
| aName = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_PROPERTIES))); |
| |
| if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_DIALOG; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlButtonModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_BUTTON; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlRadioButtonModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_RADIOBUTTON; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlCheckBoxModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_CHECKBOX; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlListBoxModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_LISTBOX; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlComboBoxModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_COMBOBOX; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlGroupBoxModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_GROUPBOX; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlEditModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_EDIT; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFixedTextModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_FIXEDTEXT; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlImageControlModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_IMAGECONTROL; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlProgressBarModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_PROGRESSBAR; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlScrollBarModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_SCROLLBAR; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFixedLineModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_FIXEDLINE; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDateFieldModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_DATEFIELD; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlTimeFieldModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_TIMEFIELD; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlNumericFieldModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_NUMERICFIELD; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlCurrencyFieldModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_CURRENCYFIELD; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFormattedFieldModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_FORMATTEDFIELD; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlPatternFieldModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_PATTERNFIELD; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFileControlModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_FILECONTROL; |
| } |
| else if ( xServiceInfo->supportsService( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.tree.TreeControlModel" ) ) ) ) |
| { |
| nResId = RID_STR_CLASS_TREECONTROL; |
| } |
| else |
| { |
| nResId = RID_STR_CLASS_CONTROL; |
| } |
| |
| if (nResId) |
| { |
| aName += ::rtl::OUString( String(IDEResId(nResId)) ); |
| } |
| } |
| else if (!_rxObject.is()) // no properties |
| { |
| aName = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_NO_PROPERTIES))); |
| } |
| // #i73075 Handled in implSetNewObjectSequence |
| //else // multiselection |
| //{ |
| // aName = ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_PROPERTIES))); |
| // aName += ::rtl::OUString(String(IDEResId(RID_STR_BRWTITLE_MULTISELECT))); |
| //} |
| |
| return aName; |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| void PropBrw::FillInfo( SfxChildWinInfo& rInfo ) const |
| { |
| rInfo.bVisible = sal_False; |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| void PropBrw::Resize() |
| { |
| SfxFloatingWindow::Resize(); |
| |
| // adjust size |
| Size aSize_ = GetOutputSizePixel(); |
| Size aPropWinSize( aSize_ ); |
| aPropWinSize.Width() -= (2*WIN_BORDER); |
| aPropWinSize.Height() -= (2*WIN_BORDER); |
| |
| if (m_xBrowserComponentWindow.is()) |
| { |
| m_xBrowserComponentWindow->setPosSize(0, 0, aPropWinSize.Width(), aPropWinSize.Height(), |
| ::com::sun::star::awt::PosSize::WIDTH | ::com::sun::star::awt::PosSize::HEIGHT); |
| } |
| } |
| |
| //---------------------------------------------------------------------------- |
| |
| void PropBrw::ImplUpdate( const Reference< XModel >& _rxContextDocument, SdrView* pNewView ) |
| { |
| Reference< XModel > xContextDocument( _rxContextDocument ); |
| |
| // if we should simply "empty" ourself, assume the context document didn't change |
| if ( !pNewView ) |
| { |
| OSL_ENSURE( !_rxContextDocument.is(), "PropBrw::ImplUpdate: no view, but a document?!" ); |
| xContextDocument = m_xContextDocument; |
| } |
| |
| if ( xContextDocument != m_xContextDocument ) |
| { |
| m_xContextDocument = xContextDocument; |
| ImplReCreateController(); |
| } |
| |
| try |
| { |
| if ( pView ) |
| { |
| EndListening( *(pView->GetModel()) ); |
| pView = NULL; |
| } |
| |
| if ( !pNewView ) |
| return; |
| |
| pView = pNewView; |
| |
| // set focus on initialization |
| if ( m_bInitialStateChange ) |
| { |
| if ( m_xBrowserComponentWindow.is() ) |
| m_xBrowserComponentWindow->setFocus(); |
| m_bInitialStateChange = sal_False; |
| } |
| |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| sal_uInt32 nMarkCount = rMarkList.GetMarkCount(); |
| |
| if ( nMarkCount == 0 ) |
| { |
| EndListening( *(pView->GetModel()) ); |
| pView = NULL; |
| implSetNewObject( NULL ); |
| return; |
| } |
| |
| Reference< XPropertySet > xNewObject; |
| Sequence< Reference< XInterface > > aNewObjects; |
| if ( nMarkCount == 1 ) |
| { |
| DlgEdObj* pDlgEdObj = PTR_CAST( DlgEdObj, rMarkList.GetMark(0)->GetMarkedSdrObj() ); |
| if ( pDlgEdObj ) |
| { |
| if ( pDlgEdObj->IsGroupObject() ) // group object |
| aNewObjects = CreateMultiSelectionSequence( rMarkList ); |
| else // single selection |
| xNewObject = xNewObject.query( pDlgEdObj->GetUnoControlModel() ); |
| } |
| } |
| else if ( nMarkCount > 1 ) // multiple selection |
| { |
| aNewObjects = CreateMultiSelectionSequence( rMarkList ); |
| } |
| |
| if ( aNewObjects.getLength() ) |
| implSetNewObjectSequence( aNewObjects ); |
| else |
| implSetNewObject( xNewObject ); |
| |
| StartListening( *(pView->GetModel()) ); |
| } |
| catch ( const PropertyVetoException& ) { /* silence */ } |
| catch ( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| } |
| |
| //---------------------------------------------------------------------------- |