diff options
author | Noel Power <noel.power@suse.com> | 2013-03-28 17:45:10 +0000 |
---|---|---|
committer | Noel Power <noel.power@suse.com> | 2013-04-04 17:29:55 +0100 |
commit | 24eb6cfc53561a73369800068aef8d62b677d6a2 (patch) | |
tree | 0c25f4ae6f892cc49bd9e511c221a32e4f2ff205 | |
parent | 4a117a4f8a25e37673ddc7760caee1a790e58cac (diff) |
Added and fixed various vba API
Added OLEObject.LinkedCell
Added ComboBox.LinkedCell
Added Validation.Type
re-enabled build ( and associated header delivery ) of bindablecontrolhelper
provided a 'real' implemenation for AutoSize member ( applicable to various controls )
Change-Id: Iee985ef1615b1b0950e578c0ed0ca10ff3db55fb
-rw-r--r-- | oovbaapi/ooo/vba/excel/XOLEObject.idl | 1 | ||||
-rw-r--r-- | oovbaapi/ooo/vba/excel/XValidation.idl | 1 | ||||
-rw-r--r-- | oovbaapi/ooo/vba/msforms/XComboBox.idl | 1 | ||||
-rw-r--r-- | sc/source/ui/vba/vbaoleobject.cxx | 17 | ||||
-rw-r--r-- | sc/source/ui/vba/vbaoleobject.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/vba/vbavalidation.cxx | 40 | ||||
-rw-r--r-- | sc/source/ui/vba/vbavalidation.hxx | 1 | ||||
-rw-r--r-- | svtools/inc/bindablecontrolhelper.hxx | 2 | ||||
-rw-r--r-- | svtools/source/misc/bindablecontrolhelper.cxx | 7 | ||||
-rw-r--r-- | vbahelper/Library_msforms.mk | 1 | ||||
-rw-r--r-- | vbahelper/source/msforms/vbacombobox.cxx | 10 | ||||
-rw-r--r-- | vbahelper/source/msforms/vbacombobox.hxx | 2 | ||||
-rw-r--r-- | vbahelper/source/msforms/vbacontrol.cxx | 58 |
13 files changed, 131 insertions, 14 deletions
diff --git a/oovbaapi/ooo/vba/excel/XOLEObject.idl b/oovbaapi/ooo/vba/excel/XOLEObject.idl index 922de379ffa1..6eae89a920f3 100644 --- a/oovbaapi/ooo/vba/excel/XOLEObject.idl +++ b/oovbaapi/ooo/vba/excel/XOLEObject.idl @@ -47,6 +47,7 @@ interface XOLEObject [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 3d30482aac9b..85c920f692a1 100644 --- a/oovbaapi/ooo/vba/excel/XValidation.idl +++ b/oovbaapi/ooo/vba/excel/XValidation.idl @@ -50,6 +50,7 @@ interface XValidation [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 7eacf254456c..d91ebfd7d44c 100644 --- a/oovbaapi/ooo/vba/msforms/XComboBox.idl +++ b/oovbaapi/ooo/vba/msforms/XComboBox.idl @@ -54,6 +54,7 @@ interface XComboBox [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 1f26ccf986a3..a65b04bae29a 100644 --- a/sc/source/ui/vba/vbaoleobject.cxx +++ b/sc/source/ui/vba/vbaoleobject.cxx @@ -34,7 +34,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; @@ -47,7 +50,7 @@ ScVbaOLEObject::ScVbaOLEObject( const uno::Reference< XHelperInterface >& xParen 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 ) ); @@ -134,6 +137,16 @@ ScVbaOLEObject::setWidth( double _width ) throw (uno::RuntimeException) 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 136f536e0da8..4f9a4ba1d642 100644 --- a/sc/source/ui/vba/vbaoleobject.hxx +++ b/sc/source/ui/vba/vbaoleobject.hxx @@ -54,6 +54,7 @@ public: 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); @@ -62,7 +63,8 @@ public: 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 358d373806cd..43859a58aa25 100644 --- a/sc/source/ui/vba/vbavalidation.cxx +++ b/sc/source/ui/vba/vbavalidation.cxx @@ -341,6 +341,46 @@ ScVbaValidation::getFormula2() throw (uno::RuntimeException) 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 526ee43c225f..fe07a00a13fb 100644 --- a/sc/source/ui/vba/vbavalidation.hxx +++ b/sc/source/ui/vba/vbavalidation.hxx @@ -60,6 +60,7 @@ public: 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/bindablecontrolhelper.hxx b/svtools/inc/bindablecontrolhelper.hxx index e53af10eaa68..f2ccf5b70c7b 100644 --- a/svtools/inc/bindablecontrolhelper.hxx +++ b/svtools/inc/bindablecontrolhelper.hxx @@ -49,7 +49,7 @@ namespace svt 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 411a37f6ec0f..fce9c4304edc 100644 --- a/svtools/source/misc/bindablecontrolhelper.cxx +++ b/svtools/source/misc/bindablecontrolhelper.cxx @@ -80,7 +80,7 @@ bool lcl_isNamedRange( const rtl::OUString& sAddress, const uno::Reference< fram 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; @@ -100,7 +100,8 @@ BindableControlHelper::ApplyListSourceAndBindableData( const com::sun::star::uno { // 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; } @@ -132,7 +133,7 @@ BindableControlHelper::ApplyListSourceAndBindableData( const com::sun::star::uno { // 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 1b0e56526cf7..3b6d0882bb62 100644 --- a/vbahelper/Library_msforms.mk +++ b/vbahelper/Library_msforms.mk @@ -58,6 +58,7 @@ $(eval $(call gb_Library_use_libraries,msforms,\ svl \ svt \ svx \ + svxcore \ tk \ tl \ vbahelper \ diff --git a/vbahelper/source/msforms/vbacombobox.cxx b/vbahelper/source/msforms/vbacombobox.cxx index cd4b5d4eda7f..e7627fc871e3 100644 --- a/vbahelper/source/msforms/vbacombobox.cxx +++ b/vbahelper/source/msforms/vbacombobox.cxx @@ -307,6 +307,16 @@ void SAL_CALL ScVbaComboBox::setLocked( sal_Bool bLocked ) throw (uno::RuntimeEx 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< rtl::OUString > ScVbaComboBox::getServiceNames() { diff --git a/vbahelper/source/msforms/vbacombobox.hxx b/vbahelper/source/msforms/vbacombobox.hxx index d8e65f28338d..7ca1ca5da8f6 100644 --- a/vbahelper/source/msforms/vbacombobox.hxx +++ b/vbahelper/source/msforms/vbacombobox.hxx @@ -79,6 +79,8 @@ public: 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 79de55159281..a5cf70e807c2 100644 --- a/vbahelper/source/msforms/vbacontrol.cxx +++ b/vbahelper/source/msforms/vbacontrol.cxx @@ -65,6 +65,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; @@ -297,7 +301,7 @@ ScVbaControl::getControlSource() throw (uno::RuntimeException) table::CellAddress aAddress; xProps->getPropertyValue( rtl::OUString( "BoundCell" ) ) >>= aAddress; xConvertor->setPropertyValue( rtl::OUString( "Address" ), uno::makeAny( aAddress ) ); - xConvertor->getPropertyValue( rtl::OUString( "XL_A1_Representation" ) ) >>= sControlSource; + xConvertor->getPropertyValue( rtl::OUString( "XLA1Representation" ) ) >>= sControlSource; } catch(const uno::Exception&) { @@ -310,7 +314,40 @@ void SAL_CALL ScVbaControl::setControlSource( const rtl::OUString& _controlsource ) throw (uno::RuntimeException) { rtl::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 ) ); } rtl::OUString SAL_CALL @@ -329,7 +366,7 @@ ScVbaControl::getRowSource() throw (uno::RuntimeException) table::CellRangeAddress aAddress; xProps->getPropertyValue( rtl::OUString( "CellRange" ) ) >>= aAddress; xConvertor->setPropertyValue( rtl::OUString( "Address"), uno::makeAny( aAddress ) ); - xConvertor->getPropertyValue( rtl::OUString( "XL_A1_Representation" ) ) >>= sRowSource; + xConvertor->getPropertyValue( rtl::OUString( "XLA1Representation" ) ) >>= sRowSource; } catch(const uno::Exception&) { @@ -343,8 +380,6 @@ ScVbaControl::setRowSource( const rtl::OUString& _rowsource ) throw (uno::Runtim { rtl::OUString sEmpty; svt::BindableControlHelper::ApplyListSourceAndBindableData( m_xModel, m_xProps, sEmpty, _rowsource ); -#else - throw uno::RuntimeException( rtl::OUString( "setRowSource not supported " ).concat( _rowsource ), uno::Reference< uno::XInterface >()); // not supported } rtl::OUString SAL_CALL @@ -700,12 +735,21 @@ void ScVbaControl::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeExcep 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) |