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.power@suse.com>
Context
- [PATCH libreoffice-4-0] Added and fixed various vba API · Noel Power (via Code Review)
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.