Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/3207 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/07/3207/1 Added and fixed various vba API Added OLEObject.LinkedCell Added ComboBox.LinkedCell Added Validation.Type provided a 'real' implemenation for AutoSize member ( applicable to various controls ) Change-Id: Id556d4c95a800951803609433e834105a6f20dbe --- M oovbaapi/ooo/vba/excel/XOLEObject.idl M oovbaapi/ooo/vba/excel/XValidation.idl M oovbaapi/ooo/vba/msforms/XComboBox.idl M sc/source/ui/vba/vbaoleobject.cxx M sc/source/ui/vba/vbaoleobject.hxx M sc/source/ui/vba/vbavalidation.cxx M sc/source/ui/vba/vbavalidation.hxx M svtools/inc/svtools/bindablecontrolhelper.hxx M svtools/source/misc/bindablecontrolhelper.cxx M vbahelper/Library_msforms.mk M vbahelper/source/msforms/vbacombobox.cxx M vbahelper/source/msforms/vbacombobox.hxx M vbahelper/source/msforms/vbacontrol.cxx 13 files changed, 131 insertions(+), 12 deletions(-) diff --git a/oovbaapi/ooo/vba/excel/XOLEObject.idl b/oovbaapi/ooo/vba/excel/XOLEObject.idl index 9eb3bc2..af1a8d1 100644 --- a/oovbaapi/ooo/vba/excel/XOLEObject.idl +++ b/oovbaapi/ooo/vba/excel/XOLEObject.idl @@ -38,6 +38,7 @@ [attribute] double Top; [attribute] double Height; [attribute] double Width; + [attribute] string LinkedCell; }; //============================================================================= diff --git a/oovbaapi/ooo/vba/excel/XValidation.idl b/oovbaapi/ooo/vba/excel/XValidation.idl index 873ca6d..a6549a9 100644 --- a/oovbaapi/ooo/vba/excel/XValidation.idl +++ b/oovbaapi/ooo/vba/excel/XValidation.idl @@ -41,6 +41,7 @@ [attribute] string ErrorMessage; [attribute, readonly] string Formula1; [attribute, readonly] string Formula2; + [attribute, readonly] long Type; void Delete(); void Add( [in] any Type, [in] any AlertStyle, [in] any Operator, [in] any Formula1, [in] any Formula2); }; diff --git a/oovbaapi/ooo/vba/msforms/XComboBox.idl b/oovbaapi/ooo/vba/msforms/XComboBox.idl index 02ee498..ac1b570 100644 --- a/oovbaapi/ooo/vba/msforms/XComboBox.idl +++ b/oovbaapi/ooo/vba/msforms/XComboBox.idl @@ -44,6 +44,7 @@ [attribute] boolean Locked; [attribute, readonly] long TextLength; [attribute, readonly] XNewFont Font; + [attribute] string LinkedCell; void AddItem( [in] any pvargItem, [in] any pvargIndex ); void removeItem( [in] any index ); diff --git a/sc/source/ui/vba/vbaoleobject.cxx b/sc/source/ui/vba/vbaoleobject.cxx index e02d7e0..8824921 100644 --- a/sc/source/ui/vba/vbaoleobject.cxx +++ b/sc/source/ui/vba/vbaoleobject.cxx @@ -25,7 +25,10 @@ #include <ooo/vba/XControlProvider.hpp> #include "vbaoleobject.hxx" - +#include <svx/svdobj.hxx> +#include "drwlayer.hxx" +#include "excelvbahelper.hxx" +#include <svtools/bindablecontrolhelper.hxx> using namespace com::sun::star; using namespace ooo::vba; @@ -38,7 +41,7 @@ uno::Reference< container::XChild > xChild( xControlModel, uno::UNO_QUERY_THROW ); xChild.set( xChild->getParent(), uno::UNO_QUERY_THROW ); xChild.set( xChild->getParent(), uno::UNO_QUERY_THROW ); - css::uno::Reference< css::frame::XModel > xModel( xChild->getParent(), uno::UNO_QUERY_THROW ); + uno::Reference<frame::XModel> xModel( xChild->getParent(), uno::UNO_QUERY_THROW ); uno::Reference<lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_QUERY_THROW ); uno::Reference< XControlProvider > xControlProvider( xServiceManager->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.ControlProvider" ) ), mxContext ), uno::UNO_QUERY_THROW ); m_xControl.set( xControlProvider->createControl( xControlShape, xModel ) ); @@ -125,6 +128,16 @@ m_xControl->setWidth( _width ); } +rtl::OUString SAL_CALL ScVbaOLEObject::getLinkedCell() throw (uno::RuntimeException) +{ + return m_xControl->getControlSource(); +} + +void SAL_CALL ScVbaOLEObject::setLinkedCell( const ::rtl::OUString& _linkedcell ) throw (uno::RuntimeException) +{ + m_xControl->setControlSource( _linkedcell ); +} + rtl::OUString ScVbaOLEObject::getServiceImplName() { diff --git a/sc/source/ui/vba/vbaoleobject.hxx b/sc/source/ui/vba/vbaoleobject.hxx index 48bcaf3..4059638 100644 --- a/sc/source/ui/vba/vbaoleobject.hxx +++ b/sc/source/ui/vba/vbaoleobject.hxx @@ -45,6 +45,7 @@ virtual void SAL_CALL setEnabled( ::sal_Bool _enabled ) throw (css::uno::RuntimeException); virtual sal_Bool SAL_CALL getVisible() throw (css::uno::RuntimeException); virtual void SAL_CALL setVisible( ::sal_Bool _visible ) throw (css::uno::RuntimeException); + virtual double SAL_CALL getLeft() throw (css::uno::RuntimeException); virtual void SAL_CALL setLeft( double _left ) throw (css::uno::RuntimeException); virtual double SAL_CALL getTop() throw (css::uno::RuntimeException); @@ -53,7 +54,8 @@ virtual void SAL_CALL setHeight( double _height ) throw (css::uno::RuntimeException); virtual double SAL_CALL getWidth() throw (css::uno::RuntimeException); virtual void SAL_CALL setWidth( double _width ) throw (css::uno::RuntimeException); - + virtual ::rtl::OUString SAL_CALL getLinkedCell() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setLinkedCell( const ::rtl::OUString& _linkedcell ) throw (::com::sun::star::uno::RuntimeException); }; #endif //SC_VBA_OLEOBJECT_HXX diff --git a/sc/source/ui/vba/vbavalidation.cxx b/sc/source/ui/vba/vbavalidation.cxx index e7ab396..7431370 100644 --- a/sc/source/ui/vba/vbavalidation.cxx +++ b/sc/source/ui/vba/vbavalidation.cxx @@ -334,6 +334,46 @@ return xCond->getFormula2(); } +sal_Int32 SAL_CALL +ScVbaValidation::getType() throw (uno::RuntimeException) +{ + uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) ); + sheet::ValidationType nValType = sheet::ValidationType_ANY; + xProps->getPropertyValue( STYPE ) >>= nValType; + sal_Int32 nExcelType = excel::XlDVType::xlValidateList; // pick a default + if ( xProps.is() ) + { + switch ( nValType ) + { + case sheet::ValidationType_LIST: + nExcelType = excel::XlDVType::xlValidateList; + break; + case sheet::ValidationType_ANY: // not ANY not really a great match for anything I fear:-( + nExcelType = excel::XlDVType::xlValidateInputOnly; + break; + case sheet::ValidationType_CUSTOM: + nExcelType = excel::XlDVType::xlValidateCustom; + break; + case sheet::ValidationType_WHOLE: + nExcelType = excel::XlDVType::xlValidateWholeNumber; + break; + case sheet::ValidationType_DECIMAL: + nExcelType = excel::XlDVType::xlValidateDecimal; + break; + case sheet::ValidationType_DATE: + nExcelType = excel::XlDVType::xlValidateDate; + break; + case sheet::ValidationType_TIME: + nExcelType = excel::XlDVType::xlValidateTime; + break; + case sheet::ValidationType_TEXT_LEN: + nExcelType = excel::XlDVType::xlValidateTextLength; + break; + }; + } + return nExcelType; +} + rtl::OUString ScVbaValidation::getServiceImplName() { diff --git a/sc/source/ui/vba/vbavalidation.hxx b/sc/source/ui/vba/vbavalidation.hxx index 0acd975..ea236a3 100644 --- a/sc/source/ui/vba/vbavalidation.hxx +++ b/sc/source/ui/vba/vbavalidation.hxx @@ -51,6 +51,7 @@ virtual void SAL_CALL setErrorMessage( const ::rtl::OUString& _errormessage ) throw (css::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getFormula1() throw (css::uno::RuntimeException) ; virtual ::rtl::OUString SAL_CALL getFormula2() throw (css::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getType() throw (css::uno::RuntimeException); // Methods virtual void SAL_CALL Delete( ) throw (css::uno::RuntimeException); virtual void SAL_CALL Add( const css::uno::Any& Type, const css::uno::Any& AlertStyle, const css::uno::Any& Operator, const css::uno::Any& Formula1, const css::uno::Any& Formula2 ) throw (css::uno::RuntimeException); diff --git a/svtools/inc/svtools/bindablecontrolhelper.hxx b/svtools/inc/svtools/bindablecontrolhelper.hxx index 15d0d0d..d9e4e7d 100644 --- a/svtools/inc/svtools/bindablecontrolhelper.hxx +++ b/svtools/inc/svtools/bindablecontrolhelper.hxx @@ -40,7 +40,7 @@ BindableControlHelper(); // never implemented public: - SVT_DLLPUBLIC static void ApplyListSourceAndBindableData( const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& xModel, const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& rObj, const rtl::OUString& rsCtrlSource, const rtl::OUString& rsRowSource ); + SVT_DLLPUBLIC static void ApplyListSourceAndBindableData( const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& xModel, const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& rObj, const rtl::OUString& rsCtrlSource, const rtl::OUString& rsRowSource, sal_uInt16 nRefTab = 0 ); }; //........................................................................ diff --git a/svtools/source/misc/bindablecontrolhelper.cxx b/svtools/source/misc/bindablecontrolhelper.cxx index 9c57747..e5cd428 100644 --- a/svtools/source/misc/bindablecontrolhelper.cxx +++ b/svtools/source/misc/bindablecontrolhelper.cxx @@ -71,7 +71,7 @@ void -BindableControlHelper::ApplyListSourceAndBindableData( const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& xModel, const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& rObj, const rtl::OUString& rsCtrlSource, const rtl::OUString& rsRowSource ) +BindableControlHelper::ApplyListSourceAndBindableData( const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& xModel, const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& rObj, const rtl::OUString& rsCtrlSource, const rtl::OUString& rsRowSource, sal_uInt16 nRefTab ) { // XBindable etc. uno::Reference< lang::XMultiServiceFactory > xFac; @@ -91,7 +91,8 @@ { // we need this service to properly convert XL notation also // Should be easy to extend - xConvertor->setPropertyValue( C2U( "XL_A1_Representation" ), uno::makeAny( rsCtrlSource ) ); + xConvertor->setPropertyValue( C2U( "ReferenceSheet" ), uno::makeAny( nRefTab ) ); + xConvertor->setPropertyValue( C2U( "XLA1Representation" ), uno::makeAny( rsCtrlSource ) ); xConvertor->getPropertyValue( C2U( "Address" ) ) >>= aAddress; } @@ -123,7 +124,7 @@ { // we need this service to properly convert XL notation also // Should be easy to extend - xConvertor->setPropertyValue( C2U( "XL_A1_Representation" ), uno::makeAny( rsRowSource ) ); + xConvertor->setPropertyValue( C2U( "XLA1Representation" ), uno::makeAny( rsRowSource ) ); xConvertor->getPropertyValue( C2U( "Address" ) ) >>= aAddress; } } diff --git a/vbahelper/Library_msforms.mk b/vbahelper/Library_msforms.mk index 63d0f67..ac9c7bd 100644 --- a/vbahelper/Library_msforms.mk +++ b/vbahelper/Library_msforms.mk @@ -58,6 +58,7 @@ svl \ svt \ svx \ + svxcore \ tk \ tl \ vbahelper \ diff --git a/vbahelper/source/msforms/vbacombobox.cxx b/vbahelper/source/msforms/vbacombobox.cxx index b78dea3..dbdabc2 100644 --- a/vbahelper/source/msforms/vbacombobox.cxx +++ b/vbahelper/source/msforms/vbacombobox.cxx @@ -277,6 +277,16 @@ ScVbaControl::setLocked( bLocked ); } +rtl::OUString SAL_CALL ScVbaComboBox::getLinkedCell() throw (uno::RuntimeException) +{ + return ScVbaControl::getControlSource(); +} + +void SAL_CALL ScVbaComboBox::setLinkedCell( const ::rtl::OUString& _linkedcell ) throw (uno::RuntimeException) +{ + ScVbaControl::setControlSource( _linkedcell ); +} + uno::Sequence< OUString > ScVbaComboBox::getServiceNames() { diff --git a/vbahelper/source/msforms/vbacombobox.hxx b/vbahelper/source/msforms/vbacombobox.hxx index f71f9c1..06adc9d 100644 --- a/vbahelper/source/msforms/vbacombobox.hxx +++ b/vbahelper/source/msforms/vbacombobox.hxx @@ -69,6 +69,8 @@ virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) throw (css::uno::RuntimeException); virtual sal_Bool SAL_CALL getLocked() throw (css::uno::RuntimeException); virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getLinkedCell() throw (css::uno::RuntimeException); + virtual void SAL_CALL setLinkedCell( const ::rtl::OUString& _linkedcell ) throw (css::uno::RuntimeException); // Methods virtual void SAL_CALL AddItem( const css::uno::Any& pvargItem, const css::uno::Any& pvargIndex ) throw (css::uno::RuntimeException); diff --git a/vbahelper/source/msforms/vbacontrol.cxx b/vbahelper/source/msforms/vbacontrol.cxx index f97ee77..288cefa 100644 --- a/vbahelper/source/msforms/vbacontrol.cxx +++ b/vbahelper/source/msforms/vbacontrol.cxx @@ -56,6 +56,10 @@ #include <vbahelper/helperdecl.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <vcl/window.hxx> +#include <com/sun/star/drawing/XDrawPagesSupplier.hpp> +#include <com/sun/star/form/XFormsSupplier.hpp> +#include <svx/svdobj.hxx> + using namespace com::sun::star; using namespace ooo::vba; @@ -286,7 +290,7 @@ table::CellAddress aAddress; xProps->getPropertyValue( "BoundCell" ) >>= aAddress; xConvertor->setPropertyValue( "Address" , uno::makeAny( aAddress ) ); - xConvertor->getPropertyValue( "XL_A1_Representation" ) >>= sControlSource; + xConvertor->getPropertyValue( "XLA1Representation" ) >>= sControlSource; } catch(const uno::Exception&) { @@ -299,7 +303,40 @@ ScVbaControl::setControlSource( const OUString& _controlsource ) throw (uno::RuntimeException) { OUString sEmpty; - svt::BindableControlHelper::ApplyListSourceAndBindableData( m_xModel, m_xProps, _controlsource, sEmpty ); + // afaik this is only relevant for Excel documents ( and we need to set up a + // reference tab in case no Sheet is specified in "_controlsource" + // Can't use the active sheet either, code may of course access + uno::Reference< drawing::XDrawPagesSupplier > xSupplier( m_xModel, uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexAccess > xIndex( xSupplier->getDrawPages(), uno::UNO_QUERY_THROW ); + sal_Int32 nLen = xIndex->getCount(); + bool bMatched = false; + sal_Int16 nRefTab = 0; + for ( sal_Int32 index = 0; index < nLen; ++index ) + { + try + { + uno::Reference< form::XFormsSupplier > xFormSupplier( xIndex->getByIndex( index ), uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexAccess > xFormIndex( xFormSupplier->getForms(), uno::UNO_QUERY_THROW ); + // get the www-standard container + uno::Reference< container::XIndexAccess > xFormControls( xFormIndex->getByIndex(0), uno::UNO_QUERY_THROW ); + sal_Int32 nCntrls = xFormControls->getCount(); + for( sal_Int32 cIndex = 0; cIndex < nCntrls; ++cIndex ) + { + uno::Reference< uno::XInterface > xControl( xFormControls->getByIndex( cIndex ), uno::UNO_QUERY_THROW ); + bMatched = ( m_xProps == xControl ); + if ( bMatched ) + { + nRefTab = index; + break; + } + } + } + catch( uno::Exception& ) {} + if ( bMatched ) + break; + } + + svt::BindableControlHelper::ApplyListSourceAndBindableData( m_xModel, m_xProps, _controlsource, sEmpty, sal_uInt16( nRefTab ) ); } OUString SAL_CALL @@ -318,7 +355,7 @@ table::CellRangeAddress aAddress; xProps->getPropertyValue( "CellRange" ) >>= aAddress; xConvertor->setPropertyValue( "Address" , uno::makeAny( aAddress ) ); - xConvertor->getPropertyValue( "XL_A1_Representation" ) >>= sRowSource; + xConvertor->getPropertyValue( "XLA1Representation" ) >>= sRowSource; } catch(const uno::Exception&) { @@ -683,12 +720,21 @@ sal_Bool ScVbaControl::getAutoSize() throw (uno::RuntimeException) { - return sal_False; + bool bIsResizeEnabled = false; + uno::Reference< uno::XInterface > xIf( m_xControl, uno::UNO_QUERY_THROW ); + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xIf ); + if ( pObj ) + bIsResizeEnabled = !pObj->IsResizeProtect(); + return bIsResizeEnabled; } // currently no implementation for this -void ScVbaControl::setAutoSize( sal_Bool /*bAutoSize*/ ) throw (uno::RuntimeException) +void ScVbaControl::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException) { + uno::Reference< uno::XInterface > xIf( m_xControl, uno::UNO_QUERY_THROW ); + SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xIf ); + if ( pObj ) + pObj->SetResizeProtect( !bAutoSize ); } sal_Bool ScVbaControl::getLocked() throw (uno::RuntimeException) -- To view, visit https://gerrit.libreoffice.org/3207 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id556d4c95a800951803609433e834105a6f20dbe Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: libreoffice-4-0 Gerrit-Owner: Noel Power <noel.po...@suse.com> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice