summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Power <noel.power@suse.com>2013-03-28 17:45:10 +0000
committerNoel Power <noel.power@suse.com>2013-04-04 17:29:55 +0100
commit24eb6cfc53561a73369800068aef8d62b677d6a2 (patch)
tree0c25f4ae6f892cc49bd9e511c221a32e4f2ff205
parent4a117a4f8a25e37673ddc7760caee1a790e58cac (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.idl1
-rw-r--r--oovbaapi/ooo/vba/excel/XValidation.idl1
-rw-r--r--oovbaapi/ooo/vba/msforms/XComboBox.idl1
-rw-r--r--sc/source/ui/vba/vbaoleobject.cxx17
-rw-r--r--sc/source/ui/vba/vbaoleobject.hxx4
-rw-r--r--sc/source/ui/vba/vbavalidation.cxx40
-rw-r--r--sc/source/ui/vba/vbavalidation.hxx1
-rw-r--r--svtools/inc/bindablecontrolhelper.hxx2
-rw-r--r--svtools/source/misc/bindablecontrolhelper.cxx7
-rw-r--r--vbahelper/Library_msforms.mk1
-rw-r--r--vbahelper/source/msforms/vbacombobox.cxx10
-rw-r--r--vbahelper/source/msforms/vbacombobox.hxx2
-rw-r--r--vbahelper/source/msforms/vbacontrol.cxx58
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)