| /************************************************************** |
| * |
| * 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_svx.hxx" |
| |
| #include "fmhelp.hrc" |
| #include "fmprop.hrc" |
| #include "fmPropBrw.hxx" |
| #include "svx/fmresids.hrc" |
| #include "fmservs.hxx" |
| #include "fmshimp.hxx" |
| #include "fmpgeimp.hxx" |
| |
| #include "svx/dialmgr.hxx" |
| #include "svx/fmpage.hxx" |
| #include "svx/fmshell.hxx" |
| #include "svx/sdrpagewindow.hxx" |
| #include "svx/svdpagv.hxx" |
| #include "svx/svxids.hrc" |
| |
| /** === begin UNO includes === **/ |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #include <com/sun/star/awt/PosSize.hpp> |
| #include <com/sun/star/form/XForm.hpp> |
| #include <com/sun/star/form/FormComponentType.hpp> |
| #include <com/sun/star/awt/XLayoutConstrains.hpp> |
| #include <com/sun/star/awt/XControlContainer.hpp> |
| #include <com/sun/star/container/XChild.hpp> |
| #include <com/sun/star/awt/PosSize.hpp> |
| #include <com/sun/star/inspection/ObjectInspector.hpp> |
| #include <com/sun/star/inspection/ObjectInspectorModel.hpp> |
| #include <com/sun/star/form/inspection/DefaultFormComponentInspectorModel.hpp> |
| #include <com/sun/star/inspection/XObjectInspectorUI.hpp> |
| #include <com/sun/star/inspection/DefaultHelpProvider.hpp> |
| /** === end UNO includes === **/ |
| |
| #include <comphelper/processfactory.hxx> |
| #include <comphelper/property.hxx> |
| #include <cppuhelper/component_context.hxx> |
| #include <sfx2/bindings.hxx> |
| #include <sfx2/childwin.hxx> |
| #include <sfx2/dispatch.hxx> |
| #include <sfx2/objitem.hxx> |
| #include <sfx2/objsh.hxx> |
| #include <sfx2/viewfrm.hxx> |
| #include <toolkit/unohlp.hxx> |
| #include <tools/debug.hxx> |
| #include <tools/diagnose_ex.h> |
| #include <tools/shl.hxx> |
| #include <unotools/confignode.hxx> |
| #include <vcl/stdtext.hxx> |
| |
| #include <algorithm> |
| |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::util; |
| using namespace ::com::sun::star::inspection; |
| using namespace ::com::sun::star::form::inspection; |
| using ::com::sun::star::awt::XWindow; |
| |
| /*************************************************************************/ |
| //======================================================================== |
| //= FmPropBrwMgr |
| //======================================================================== |
| //----------------------------------------------------------------------- |
| SFX_IMPL_FLOATINGWINDOW(FmPropBrwMgr, SID_FM_SHOW_PROPERTIES) |
| |
| //----------------------------------------------------------------------- |
| FmPropBrwMgr::FmPropBrwMgr( Window* _pParent, sal_uInt16 _nId, |
| SfxBindings* _pBindings, SfxChildWinInfo* _pInfo) |
| :SfxChildWindow(_pParent, _nId) |
| { |
| pWindow = new FmPropBrw( ::comphelper::getProcessServiceFactory(), _pBindings, this, _pParent, _pInfo ); |
| eChildAlignment = SFX_ALIGN_NOALIGNMENT; |
| ((SfxFloatingWindow*)pWindow)->Initialize( _pInfo ); |
| } |
| |
| //======================================================================== |
| //======================================================================== |
| 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; |
| |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::form; |
| using namespace ::com::sun::star::frame; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::container; |
| using namespace ::svxform; |
| |
| ::rtl::OUString GetUIHeadlineName(sal_Int16 nClassId, const Any& aUnoObj) |
| { |
| sal_uInt16 nClassNameResourceId = 0; |
| |
| switch ( nClassId ) |
| { |
| case FormComponentType::TEXTFIELD: |
| { |
| Reference< XInterface > xIFace; |
| aUnoObj >>= xIFace; |
| nClassNameResourceId = RID_STR_PROPTITLE_EDIT; |
| if (xIFace.is()) |
| { // we have a chance to check if it's a formatted field model |
| Reference< XServiceInfo > xInfo(xIFace, UNO_QUERY); |
| if (xInfo.is() && (xInfo->supportsService(FM_SUN_COMPONENT_FORMATTEDFIELD))) |
| nClassNameResourceId = RID_STR_PROPTITLE_FORMATTED; |
| else if (!xInfo.is()) |
| { |
| // couldn't distinguish between formatted and edit with the service name, so try with the properties |
| Reference< XPropertySet > xProps(xIFace, UNO_QUERY); |
| if (xProps.is()) |
| { |
| Reference< XPropertySetInfo > xPropsInfo = xProps->getPropertySetInfo(); |
| if (xPropsInfo.is() && xPropsInfo->hasPropertyByName(FM_PROP_FORMATSSUPPLIER)) |
| nClassNameResourceId = RID_STR_PROPTITLE_FORMATTED; |
| } |
| } |
| } |
| } |
| break; |
| |
| case FormComponentType::COMMANDBUTTON: |
| nClassNameResourceId = RID_STR_PROPTITLE_PUSHBUTTON; break; |
| case FormComponentType::RADIOBUTTON: |
| nClassNameResourceId = RID_STR_PROPTITLE_RADIOBUTTON; break; |
| case FormComponentType::CHECKBOX: |
| nClassNameResourceId = RID_STR_PROPTITLE_CHECKBOX; break; |
| case FormComponentType::LISTBOX: |
| nClassNameResourceId = RID_STR_PROPTITLE_LISTBOX; break; |
| case FormComponentType::COMBOBOX: |
| nClassNameResourceId = RID_STR_PROPTITLE_COMBOBOX; break; |
| case FormComponentType::GROUPBOX: |
| nClassNameResourceId = RID_STR_PROPTITLE_GROUPBOX; break; |
| case FormComponentType::IMAGEBUTTON: |
| nClassNameResourceId = RID_STR_PROPTITLE_IMAGEBUTTON; break; |
| case FormComponentType::FIXEDTEXT: |
| nClassNameResourceId = RID_STR_PROPTITLE_FIXEDTEXT; break; |
| case FormComponentType::GRIDCONTROL: |
| nClassNameResourceId = RID_STR_PROPTITLE_DBGRID; break; |
| case FormComponentType::FILECONTROL: |
| nClassNameResourceId = RID_STR_PROPTITLE_FILECONTROL; break; |
| case FormComponentType::DATEFIELD: |
| nClassNameResourceId = RID_STR_PROPTITLE_DATEFIELD; break; |
| case FormComponentType::TIMEFIELD: |
| nClassNameResourceId = RID_STR_PROPTITLE_TIMEFIELD; break; |
| case FormComponentType::NUMERICFIELD: |
| nClassNameResourceId = RID_STR_PROPTITLE_NUMERICFIELD; break; |
| case FormComponentType::CURRENCYFIELD: |
| nClassNameResourceId = RID_STR_PROPTITLE_CURRENCYFIELD; break; |
| case FormComponentType::PATTERNFIELD: |
| nClassNameResourceId = RID_STR_PROPTITLE_PATTERNFIELD; break; |
| case FormComponentType::IMAGECONTROL: |
| nClassNameResourceId = RID_STR_PROPTITLE_IMAGECONTROL; break; |
| case FormComponentType::HIDDENCONTROL: |
| nClassNameResourceId = RID_STR_PROPTITLE_HIDDEN; break; |
| case FormComponentType::SCROLLBAR: |
| nClassNameResourceId = RID_STR_PROPTITLE_SCROLLBAR; break; |
| case FormComponentType::SPINBUTTON: |
| nClassNameResourceId = RID_STR_PROPTITLE_SPINBUTTON; break; |
| case FormComponentType::NAVIGATIONBAR: |
| nClassNameResourceId = RID_STR_PROPTITLE_NAVBAR; break; |
| case FormComponentType::CONTROL: |
| default: |
| nClassNameResourceId = RID_STR_CONTROL; break; |
| } |
| |
| if ( !nClassNameResourceId ) |
| return ::rtl::OUString(); |
| |
| return ::rtl::OUString( String( SVX_RES( nClassNameResourceId ) ) ); |
| } |
| |
| //======================================================================== |
| // class FmPropBrw |
| //======================================================================== |
| DBG_NAME(FmPropBrw); |
| //------------------------------------------------------------------------ |
| FmPropBrw::FmPropBrw( const Reference< XMultiServiceFactory >& _xORB, SfxBindings* _pBindings, |
| SfxChildWindow* _pMgr, Window* _pParent, const SfxChildWinInfo* _pInfo ) |
| :SfxFloatingWindow(_pBindings, _pMgr, _pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_3DLOOK|WB_ROLLABLE) ) |
| ,SfxControllerItem(SID_FM_PROPERTY_CONTROL, *_pBindings) |
| ,m_bInitialStateChange(sal_True) |
| ,m_bInStateChange( false ) |
| ,m_xORB(_xORB) |
| { |
| DBG_CTOR(FmPropBrw,NULL); |
| |
| ::Size aPropWinSize(STD_WIN_SIZE_X,STD_WIN_SIZE_Y); |
| SetMinOutputSizePixel(::Size(STD_MIN_SIZE_X,STD_MIN_SIZE_Y)); |
| SetOutputSizePixel(aPropWinSize); |
| SetUniqueId(UID_FORMPROPBROWSER_FRAME); |
| |
| 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()) |
| { |
| // create an intermediate window, which is to be the container window of the frame |
| // Do *not* use |this| as container window for the frame, this would result in undefined |
| // responsiblity for this window (as soon as we initialize a frame with a window, the frame |
| // is responsible for it's life time, but |this| is controlled by the belonging SfxChildWindow) |
| // #i34249# - 2004-09-27 - fs@openoffice.org |
| Window* pContainerWindow = new Window( this ); |
| pContainerWindow->Show(); |
| m_xFrameContainerWindow = VCLUnoHelper::GetInterface ( pContainerWindow ); |
| |
| m_xMeAsFrame->initialize( m_xFrameContainerWindow ); |
| m_xMeAsFrame->setName(::rtl::OUString::createFromAscii("form property browser")); |
| if ( _pBindings->GetDispatcher() ) |
| { |
| ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFramesSupplier > |
| xSupp ( _pBindings->GetDispatcher()->GetFrame()->GetFrame().GetFrameInterface(), ::com::sun::star::uno::UNO_QUERY ); |
| // if ( xSupp.is() ) |
| // xSupp->getFrames()->append( m_xMeAsFrame ); |
| // Don't append frame to frame hierachy to prevent UI_DEACTIVATE messages |
| // #i31834# - 2004-07-27 - cd@openoffice.org |
| } |
| } |
| } |
| catch (Exception&) |
| { |
| DBG_ERROR("FmPropBrw::FmPropBrw: could not create/initialize my frame!"); |
| m_xMeAsFrame.clear(); |
| } |
| |
| if (m_xMeAsFrame.is()) |
| _pMgr->SetFrame( m_xMeAsFrame ); |
| |
| |
| if ( m_xBrowserComponentWindow.is() ) |
| m_xBrowserComponentWindow->setVisible( sal_True ); |
| |
| if ( _pInfo ) |
| m_sLastActivePage = _pInfo->aExtraString; |
| } |
| |
| //------------------------------------------------------------------------ |
| void FmPropBrw::Resize() |
| { |
| SfxFloatingWindow::Resize(); |
| |
| if ( m_xFrameContainerWindow.is() ) |
| { |
| try |
| { |
| ::Size aOutputSize( GetOutputSizePixel() ); |
| m_xFrameContainerWindow->setPosSize( 0, 0, aOutputSize.Width(), aOutputSize.Height(), awt::PosSize::POSSIZE ); |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "FmPropBrw::Resize: caught an exception!" ); |
| } |
| } |
| } |
| |
| //------------------------------------------------------------------------ |
| FmPropBrw::~FmPropBrw() |
| { |
| if (m_xBrowserController.is()) |
| implDetachController(); |
| try |
| { |
| // remove our own properties from the component context. We cannot ensure that the component context |
| // is freed (there might be refcount problems :-\), so at least ensure the context itself |
| // does hold the objects anymore |
| Reference<XNameContainer> xName(m_xInspectorContext,uno::UNO_QUERY); |
| if ( xName.is() ) |
| { |
| const ::rtl::OUString pProps[] = { ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ContextDocument" ) ) |
| , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) ) |
| , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlContext" ) ) |
| , ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlShapeAccess" ) ) }; |
| for ( size_t i = 0; i < sizeof(pProps)/sizeof(pProps[0]); ++i ) |
| xName->removeByName( pProps[i] ); |
| } |
| } |
| catch (const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| DBG_DTOR(FmPropBrw,NULL); |
| } |
| |
| //----------------------------------------------------------------------- |
| ::rtl::OUString FmPropBrw::getCurrentPage() const |
| { |
| ::rtl::OUString sCurrentPage; |
| try |
| { |
| if ( m_xBrowserController.is() ) |
| { |
| OSL_VERIFY( m_xBrowserController->getViewData() >>= sCurrentPage ); |
| } |
| |
| if ( !sCurrentPage.getLength() ) |
| sCurrentPage = m_sLastActivePage; |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "FmPropBrw::getCurrentPage: caught an exception while retrieving the current page!" ); |
| } |
| return sCurrentPage; |
| } |
| |
| //----------------------------------------------------------------------- |
| void FmPropBrw::implDetachController() |
| { |
| m_sLastActivePage = getCurrentPage(); |
| |
| implSetNewSelection( InterfaceBag() ); |
| |
| if ( m_xMeAsFrame.is() ) |
| { |
| try |
| { |
| m_xMeAsFrame->setComponent(NULL, NULL); |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "FmPropBrw::implDetachController: caught an exception while resetting the component!" ); |
| } |
| } |
| |
| // we attached a frame to the controller manually, so we need to manually tell it that it's detached, too |
| // 96068 - 09.01.2002 - fs@openoffice.org |
| if ( m_xBrowserController.is() ) |
| m_xBrowserController->attachFrame( NULL ); |
| |
| m_xBrowserController.clear(); |
| m_xInspectorModel.clear(); |
| m_xMeAsFrame.clear(); |
| } |
| |
| //----------------------------------------------------------------------- |
| sal_Bool FmPropBrw::Close() |
| { |
| // suspend the controller (it is allowed to veto) |
| if ( m_xMeAsFrame.is() ) |
| { |
| try |
| { |
| Reference< XController > xController( m_xMeAsFrame->getController() ); |
| if ( xController.is() && !xController->suspend( sal_True ) ) |
| return sal_False; |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "FmPropBrw::Close: caught an exception while asking the controller!" ); |
| } |
| } |
| |
| implDetachController(); |
| |
| if( IsRollUp() ) |
| RollDown(); |
| |
| // remember our bindings: while we're closed, we're deleted, too, so accessing the bindings after this |
| // would be deadly |
| // 10/19/00 - 79321 - FS |
| SfxBindings& rBindings = SfxControllerItem::GetBindings(); |
| |
| sal_Bool bClose = SfxFloatingWindow::Close(); |
| |
| if (bClose) |
| { |
| rBindings.Invalidate(SID_FM_CTL_PROPERTIES); |
| rBindings.Invalidate(SID_FM_PROPERTIES); |
| } |
| |
| return bClose; |
| } |
| |
| //----------------------------------------------------------------------- |
| bool FmPropBrw::implIsReadOnlyModel() const |
| { |
| try |
| { |
| if ( m_xInspectorModel.is() ) |
| return m_xInspectorModel->getIsReadOnly(); |
| return false; |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| return true; |
| } |
| |
| //----------------------------------------------------------------------- |
| void FmPropBrw::implSetNewSelection( const InterfaceBag& _rSelection ) |
| { |
| if ( m_xBrowserController.is() ) |
| { |
| try |
| { |
| Reference< XObjectInspector > xInspector( m_xBrowserController, UNO_QUERY_THROW ); |
| |
| // tell it the objects to inspect |
| Sequence< Reference< XInterface > > aSelection( _rSelection.size() ); |
| ::std::copy( _rSelection.begin(), _rSelection.end(), aSelection.getArray() ); |
| |
| xInspector->inspect( aSelection ); |
| } |
| catch( const VetoException& ) |
| { |
| return; |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "FmPropBrw::implSetNewSelection: caught an unexpected exception!" ); |
| return; |
| } |
| |
| // set the new title according to the selected object |
| String sTitle; |
| |
| if ( _rSelection.empty() ) |
| { |
| sTitle = String( SVX_RES( RID_STR_NO_PROPERTIES ) ); |
| } |
| else if ( _rSelection.size() > 1 ) |
| { |
| // no form component and (no form or no name) -> Multiselection |
| sTitle = String( SVX_RES( RID_STR_PROPERTIES_CONTROL ) ); |
| sTitle += String( SVX_RES( RID_STR_PROPTITLE_MULTISELECT ) ); |
| } |
| else |
| { |
| Reference< XPropertySet > xSingleSelection( *_rSelection.begin(), UNO_QUERY); |
| if ( ::comphelper::hasProperty( FM_PROP_CLASSID, xSingleSelection ) ) |
| { |
| sal_Int16 nClassID = FormComponentType::CONTROL; |
| xSingleSelection->getPropertyValue( FM_PROP_CLASSID ) >>= nClassID; |
| |
| sTitle = String( SVX_RES( RID_STR_PROPERTIES_CONTROL ) ); |
| sTitle += String( GetUIHeadlineName( nClassID, makeAny( xSingleSelection ) ) ); |
| } |
| else if ( Reference< XForm >( xSingleSelection, UNO_QUERY ).is() ) |
| sTitle = String( SVX_RES( RID_STR_PROPERTIES_FORM ) ); |
| } |
| |
| if ( implIsReadOnlyModel() ) |
| sTitle += String( SVX_RES( RID_STR_READONLY_VIEW ) ); |
| |
| SetText( sTitle ); |
| |
| // #95343# --------------------------------- |
| Reference< ::com::sun::star::awt::XLayoutConstrains > xLayoutConstrains( m_xBrowserController, UNO_QUERY ); |
| if( xLayoutConstrains.is() ) |
| { |
| ::Size aConstrainedSize; |
| ::com::sun::star::awt::Size aMinSize = xLayoutConstrains->getMinimumSize(); |
| |
| sal_Int32 nLeft(0), nTop(0), nRight(0), nBottom(0); |
| GetBorder( nLeft, nTop, nRight, nBottom ); |
| aMinSize.Width += nLeft + nRight + 8; |
| aMinSize.Height += nTop + nBottom + 8; |
| |
| aConstrainedSize.setHeight( aMinSize.Height ); |
| aConstrainedSize.setWidth( aMinSize.Width ); |
| SetMinOutputSizePixel( aConstrainedSize ); |
| aConstrainedSize = GetOutputSizePixel(); |
| sal_Bool bResize = sal_False; |
| if( aConstrainedSize.Width() < aMinSize.Width ) |
| { |
| aConstrainedSize.setWidth( aMinSize.Width ); |
| bResize = sal_True; |
| } |
| if( aConstrainedSize.Height() < aMinSize.Height ) |
| { |
| aConstrainedSize.setHeight( aMinSize.Height ); |
| bResize = sal_True; |
| } |
| if( bResize ) |
| SetOutputSizePixel( aConstrainedSize ); |
| } |
| } |
| } |
| |
| //----------------------------------------------------------------------- |
| void FmPropBrw::FillInfo( SfxChildWinInfo& rInfo ) const |
| { |
| rInfo.bVisible = sal_False; |
| rInfo.aExtraString = getCurrentPage(); |
| } |
| |
| //----------------------------------------------------------------------- |
| IMPL_LINK( FmPropBrw, OnAsyncGetFocus, void*, /*NOTINTERESTEDIN*/ ) |
| { |
| if (m_xBrowserComponentWindow.is()) |
| m_xBrowserComponentWindow->setFocus(); |
| return 0L; |
| } |
| |
| //----------------------------------------------------------------------- |
| namespace |
| { |
| static bool lcl_shouldEnableHelpSection( const Reference< XMultiServiceFactory >& _rxFactory ) |
| { |
| const ::rtl::OUString sConfigName( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Forms/PropertyBrowser/" ) ); |
| const ::rtl::OUString sPropertyName( RTL_CONSTASCII_USTRINGPARAM( "DirectHelp" ) ); |
| |
| ::utl::OConfigurationTreeRoot aConfiguration( |
| ::utl::OConfigurationTreeRoot::createWithServiceFactory( _rxFactory, sConfigName ) ); |
| |
| bool bEnabled = false; |
| OSL_VERIFY( aConfiguration.getNodeValue( sPropertyName ) >>= bEnabled ); |
| return bEnabled; |
| } |
| } |
| //----------------------------------------------------------------------- |
| void FmPropBrw::impl_createPropertyBrowser_throw( FmFormShell* _pFormShell ) |
| { |
| // the document in which we live |
| Reference< XInterface > xDocument; |
| if ( _pFormShell && _pFormShell->GetObjectShell() ) |
| xDocument = _pFormShell->GetObjectShell()->GetModel(); |
| |
| // the context of the controls in our document |
| Reference< awt::XControlContainer > xControlContext; |
| if ( _pFormShell && _pFormShell->GetFormView() ) |
| { |
| SdrPageView* pPageView = _pFormShell->GetFormView()->GetSdrPageView(); |
| |
| if(pPageView) |
| { |
| SdrPageWindow* pPageWindow = pPageView->GetPageWindow(0L); |
| |
| if(pPageWindow) |
| { |
| xControlContext = pPageWindow->GetControlContainer(); |
| } |
| } |
| } |
| |
| // the default parent window for message boxes |
| Reference< XWindow > xParentWindow( VCLUnoHelper::GetInterface ( this ) ); |
| |
| // the mapping from control models to control shapes |
| Reference< XMap > xControlMap; |
| FmFormPage* pFormPage = _pFormShell ? _pFormShell->GetCurPage() : NULL; |
| if ( pFormPage ) |
| xControlMap = pFormPage->GetImpl().getControlToShapeMap(); |
| |
| // our own component context |
| 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( "ContextDocument" ) ), makeAny( xDocument ) ), |
| ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DialogParentWindow" ) ), makeAny( xParentWindow ) ), |
| ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlContext" ) ), makeAny( xControlContext ) ), |
| ::cppu::ContextEntry_Init( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ControlShapeAccess" ) ), makeAny( xControlMap ) ) |
| }; |
| m_xInspectorContext.set( |
| ::cppu::createComponentContext( aHandlerContextInfo, sizeof( aHandlerContextInfo ) / sizeof( aHandlerContextInfo[0] ), |
| xOwnContext ) ); |
| |
| bool bEnableHelpSection = lcl_shouldEnableHelpSection( m_xORB ); |
| |
| // an object inspector model |
| m_xInspectorModel = |
| bEnableHelpSection |
| ? DefaultFormComponentInspectorModel::createWithHelpSection( m_xInspectorContext, 3, 5 ) |
| : DefaultFormComponentInspectorModel::createDefault( m_xInspectorContext ); |
| |
| // an object inspector |
| m_xBrowserController = m_xBrowserController.query( |
| ObjectInspector::createWithModel( |
| m_xInspectorContext, m_xInspectorModel |
| ) ); |
| |
| if ( !m_xBrowserController.is() ) |
| { |
| ::rtl::OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.inspection.ObjectInspector" ) ); |
| ShowServiceNotAvailableError( GetParent(), sServiceName, sal_True ); |
| } |
| else |
| { |
| m_xBrowserController->attachFrame( m_xMeAsFrame ); |
| m_xBrowserComponentWindow = m_xMeAsFrame->getComponentWindow(); |
| DBG_ASSERT( m_xBrowserComponentWindow.is(), "FmPropBrw::impl_createPropertyBrowser_throw: attached the controller, but have no component window!" ); |
| } |
| |
| if ( bEnableHelpSection ) |
| { |
| Reference< XObjectInspector > xInspector( m_xBrowserController, UNO_QUERY_THROW ); |
| Reference< XObjectInspectorUI > xInspectorUI( xInspector->getInspectorUI() ); |
| Reference< XInterface > xDefaultHelpProvider( DefaultHelpProvider::create( m_xInspectorContext, xInspectorUI ) ); |
| } |
| } |
| |
| //----------------------------------------------------------------------- |
| void FmPropBrw::impl_ensurePropertyBrowser_nothrow( FmFormShell* _pFormShell ) |
| { |
| // the document in which we live |
| Reference< XInterface > xDocument; |
| SfxObjectShell* pObjectShell = _pFormShell ? _pFormShell->GetObjectShell() : NULL; |
| if ( pObjectShell ) |
| xDocument = pObjectShell->GetModel(); |
| if ( ( xDocument == m_xLastKnownDocument ) && m_xBrowserController.is() ) |
| // nothing to do |
| return; |
| |
| try |
| { |
| // clean up any previous instances of the object inspector |
| if ( m_xMeAsFrame.is() ) |
| m_xMeAsFrame->setComponent( NULL, NULL ); |
| else |
| ::comphelper::disposeComponent( m_xBrowserController ); |
| m_xBrowserController.clear(); |
| m_xInspectorModel.clear(); |
| m_xBrowserComponentWindow.clear(); |
| |
| // and create a new one |
| impl_createPropertyBrowser_throw( _pFormShell ); |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| m_xLastKnownDocument = xDocument; |
| } |
| |
| //----------------------------------------------------------------------- |
| void FmPropBrw::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState) |
| { |
| if (!pState || SID_FM_PROPERTY_CONTROL != nSID) |
| return; |
| |
| m_bInStateChange = true; |
| try |
| { |
| if (eState >= SFX_ITEM_AVAILABLE) |
| { |
| FmFormShell* pShell = PTR_CAST(FmFormShell,((SfxObjectItem*)pState)->GetShell()); |
| InterfaceBag aSelection; |
| if ( pShell ) |
| pShell->GetImpl()->getCurrentSelection( aSelection ); |
| |
| impl_ensurePropertyBrowser_nothrow( pShell ); |
| |
| // set the new object to inspect |
| implSetNewSelection( aSelection ); |
| |
| // if this is the first time we're here, some additional things need to be done ... |
| if ( m_bInitialStateChange ) |
| { |
| // if we're just newly created, we want to have the focus |
| PostUserEvent( LINK( this, FmPropBrw, OnAsyncGetFocus ) ); |
| |
| // and additionally, we want to show the page which was active during |
| // our previous incarnation |
| if ( m_sLastActivePage.getLength() ) |
| { |
| try |
| { |
| if ( m_xBrowserController.is() ) |
| m_xBrowserController->restoreViewData( makeAny( m_sLastActivePage ) ); |
| } |
| catch( const Exception& ) |
| { |
| OSL_ENSURE( sal_False, "FmPropBrw::StateChanged: caught an exception while setting the initial page!" ); |
| } |
| } |
| |
| m_bInitialStateChange = sal_False; |
| } |
| |
| } |
| else |
| { |
| implSetNewSelection( InterfaceBag() ); |
| } |
| } |
| catch (Exception&) |
| { |
| DBG_ERROR("FmPropBrw::StateChanged: Exception occured!"); |
| } |
| m_bInStateChange = false; |
| } |