oovbaapi/ooo/vba/excel/XOLEObject.idl | 1 oovbaapi/ooo/vba/excel/XValidation.idl | 1 oovbaapi/ooo/vba/msforms/XComboBox.idl | 1 sc/source/ui/vba/vbaapplication.cxx | 15 ++++++ sc/source/ui/vba/vbaapplication.hxx | 2 sc/source/ui/vba/vbaoleobject.cxx | 17 ++++++- sc/source/ui/vba/vbaoleobject.hxx | 4 + sc/source/ui/vba/vbarange.cxx | 4 - sc/source/ui/vba/vbarange.hxx | 1 sc/source/ui/vba/vbavalidation.cxx | 59 +++++++++++++++++++++++++- sc/source/ui/vba/vbavalidation.hxx | 1 svtools/inc/svtools/bindablecontrolhelper.hxx | 2 svtools/source/misc/bindablecontrolhelper.cxx | 7 +-- vbahelper/Library_msforms.mk | 1 vbahelper/source/msforms/vbacombobox.cxx | 10 ++++ vbahelper/source/msforms/vbacombobox.hxx | 2 vbahelper/source/msforms/vbacontrol.cxx | 56 ++++++++++++++++++++++-- 17 files changed, 168 insertions(+), 16 deletions(-)
New commits: commit 264e6370dc5df458a494d2f5082251bf60145a19 Author: Noel Power <noel.po...@suse.com> Date: Fri Mar 29 16:53:24 2013 +0000 squash NoSuchElementExceptions when modifying keybindings Change-Id: I37882845660929e0001a834b6685a4087dfb465f Reviewed-on: https://gerrit.libreoffice.org/3208 Reviewed-by: Miklos Vajna <vmik...@suse.cz> Tested-by: Miklos Vajna <vmik...@suse.cz> diff --git a/sc/source/ui/vba/vbaapplication.cxx b/sc/source/ui/vba/vbaapplication.cxx index f15f0ab..db8bcaf 100644 --- a/sc/source/ui/vba/vbaapplication.cxx +++ b/sc/source/ui/vba/vbaapplication.cxx @@ -1297,6 +1297,21 @@ ScVbaApplication::MenuBars( const uno::Any& aIndex ) throw (uno::RuntimeExceptio return uno::Any( xMenuBars ); } +void SAL_CALL ScVbaApplication::OnKey( const ::rtl::OUString& Key, const uno::Any& Procedure ) throw (uno::RuntimeException) +{ + try + { + // Perhaps we can catch some excel specific + // related behaviour here + VbaApplicationBase::OnKey( Key, Procedure ); + } + catch( container::NoSuchElementException& ) + { + // #TODO special handling for unhandled + // bindings + } +} + rtl::OUString ScVbaApplication::getServiceImplName() { diff --git a/sc/source/ui/vba/vbaapplication.hxx b/sc/source/ui/vba/vbaapplication.hxx index 072bd0c..7541178 100644 --- a/sc/source/ui/vba/vbaapplication.hxx +++ b/sc/source/ui/vba/vbaapplication.hxx @@ -96,7 +96,7 @@ public: virtual void SAL_CALL setStatusBar( const css::uno::Any& _statusbar ) throw (css::uno::RuntimeException); virtual ::sal_Int32 SAL_CALL getCursor() throw (css::uno::RuntimeException); virtual void SAL_CALL setCursor( ::sal_Int32 _cursor ) throw (css::uno::RuntimeException); - + virtual void SAL_CALL OnKey( const ::rtl::OUString& Key, const css::uno::Any& Procedure ) throw (css::uno::RuntimeException); virtual sal_Bool SAL_CALL getEnableEvents() throw (css::uno::RuntimeException); virtual void SAL_CALL setEnableEvents( sal_Bool bEnable ) throw (css::uno::RuntimeException); commit c1df69d8380825953d4b3a9ac8dcf361b7a5a4a4 Author: Noel Power <noel.po...@suse.com> Date: Fri Mar 29 16:46:21 2013 +0000 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 Reviewed-on: https://gerrit.libreoffice.org/3207 Reviewed-by: Miklos Vajna <vmik...@suse.cz> Tested-by: Miklos Vajna <vmik...@suse.cz> 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 @@ 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 873ca6d..a6549a9 100644 --- a/oovbaapi/ooo/vba/excel/XValidation.idl +++ b/oovbaapi/ooo/vba/excel/XValidation.idl @@ -41,6 +41,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 02ee498..ac1b570 100644 --- a/oovbaapi/ooo/vba/msforms/XComboBox.idl +++ b/oovbaapi/ooo/vba/msforms/XComboBox.idl @@ -44,6 +44,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 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 @@ 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 ) ); @@ -125,6 +128,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 48bcaf3..4059638 100644 --- a/sc/source/ui/vba/vbaoleobject.hxx +++ b/sc/source/ui/vba/vbaoleobject.hxx @@ -45,6 +45,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); @@ -53,7 +54,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 e7ab396..7431370 100644 --- a/sc/source/ui/vba/vbavalidation.cxx +++ b/sc/source/ui/vba/vbavalidation.cxx @@ -334,6 +334,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 0acd975..ea236a3 100644 --- a/sc/source/ui/vba/vbavalidation.hxx +++ b/sc/source/ui/vba/vbavalidation.hxx @@ -51,6 +51,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/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 @@ 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 9c57747..e5cd428 100644 --- a/svtools/source/misc/bindablecontrolhelper.cxx +++ b/svtools/source/misc/bindablecontrolhelper.cxx @@ -71,7 +71,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; @@ -91,7 +91,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; } @@ -123,7 +124,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 63d0f67..ac9c7bd 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 b78dea3..dbdabc2 100644 --- a/vbahelper/source/msforms/vbacombobox.cxx +++ b/vbahelper/source/msforms/vbacombobox.cxx @@ -277,6 +277,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< 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 @@ 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 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 @@ ScVbaControl::getControlSource() throw (uno::RuntimeException) 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 @@ void SAL_CALL 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 @@ ScVbaControl::getRowSource() throw (uno::RuntimeException) 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 @@ 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) commit bed93effc620626e8a7e0704cda6aafdd6ad8088 Author: Noel Power <noel.po...@suse.com> Date: Fri Mar 29 15:54:08 2013 +0000 prepend Validation.Formula1 results with '=' for anything not a address Change-Id: I6061378788b7299f8a8431d1e8d00a4e6ea3e8fb Reviewed-on: https://gerrit.libreoffice.org/3206 Reviewed-by: Miklos Vajna <vmik...@suse.cz> Tested-by: Miklos Vajna <vmik...@suse.cz> diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx index 8b77f27..abbe31e 100644 --- a/sc/source/ui/vba/vbarange.cxx +++ b/sc/source/ui/vba/vbarange.cxx @@ -1146,7 +1146,7 @@ public: }; bool -getCellRangesForAddress( sal_uInt16& rResFlags, const rtl::OUString& sAddress, ScDocShell* pDocSh, ScRangeList& rCellRanges, formula::FormulaGrammar::AddressConvention& eConv, char cDelimiter = 0 ) +ScVbaRange::getCellRangesForAddress( sal_uInt16& rResFlags, const rtl::OUString& sAddress, ScDocShell* pDocSh, ScRangeList& rCellRanges, formula::FormulaGrammar::AddressConvention& eConv, char cDelimiter ) { ScDocument* pDoc = NULL; @@ -1221,7 +1221,7 @@ bool getScRangeListForAddress( const rtl::OUString& sName, ScDocShell* pDocSh, S } sal_uInt16 nFlags = 0; - if ( !getCellRangesForAddress( nFlags, sAddress, pDocSh, aCellRanges, eConv, aChar ) ) + if ( !ScVbaRange::getCellRangesForAddress( nFlags, sAddress, pDocSh, aCellRanges, eConv, aChar ) ) return false; bool bTabFromReferrer = !( nFlags & SCA_TAB_3D ); diff --git a/sc/source/ui/vba/vbarange.hxx b/sc/source/ui/vba/vbarange.hxx index ff4c618..7c3a3d9 100644 --- a/sc/source/ui/vba/vbarange.hxx +++ b/sc/source/ui/vba/vbarange.hxx @@ -285,6 +285,7 @@ public: // * object should be a lightweight as possible // * we shouldn't need hacks like this below static css::uno::Reference< ov::excel::XRange > ApplicationRange( const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Any &Cell1, const css::uno::Any &Cell2 ) throw (css::uno::RuntimeException); + static bool getCellRangesForAddress( sal_uInt16& rResFlags, const rtl::OUString& sAddress, ScDocShell* pDocSh, ScRangeList& rCellRanges, formula::FormulaGrammar::AddressConvention& eConv, char cDelimiter = 0 ); virtual sal_Bool SAL_CALL GoalSeek( const css::uno::Any& Goal, const css::uno::Reference< ov::excel::XRange >& ChangingCell ) throw (css::uno::RuntimeException); virtual css::uno::Reference< ov::excel::XRange > SAL_CALL SpecialCells( const css::uno::Any& _oType, const css::uno::Any& _oValue) throw ( css::script::BasicErrorException ); // XErrorQuery diff --git a/sc/source/ui/vba/vbavalidation.cxx b/sc/source/ui/vba/vbavalidation.cxx index 1ba1724..e7ab396 100644 --- a/sc/source/ui/vba/vbavalidation.cxx +++ b/sc/source/ui/vba/vbavalidation.cxx @@ -28,6 +28,9 @@ #include <ooo/vba/excel/XlDVAlertStyle.hpp> #include "unonames.hxx" +#include "rangelst.hxx" +#include "excelvbahelper.hxx" +#include "vbarange.hxx" using namespace ::ooo::vba; using namespace ::com::sun::star; @@ -307,7 +310,21 @@ ScVbaValidation::Add( const uno::Any& Type, const uno::Any& AlertStyle, const un ScVbaValidation::getFormula1() throw (uno::RuntimeException) { uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW ); - return xCond->getFormula1(); + rtl::OUString sString = xCond->getFormula1(); + + sal_uInt16 nFlags = 0; + ScRangeList aCellRanges; + formula::FormulaGrammar::AddressConvention eConv = formula::FormulaGrammar::CONV_XL_A1; + + ScDocShell* pDocSh = excel::GetDocShellFromRange( m_xRange ); + // in calc validation formula is either a range or formula + // that results in range. + // In VBA both formula and address can have a leading '=' + // in result of getFormula1, however it *seems* that a named range or + // real formula has to (or is expected to) have the '=' + if ( pDocSh && !ScVbaRange::getCellRangesForAddress( nFlags, sString, pDocSh, aCellRanges, eConv ) ) + sString = "=" + sString; + return sString; } ::rtl::OUString SAL_CALL _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits