[ooo-build-commit] Branch 'ooo-build-3-1-1' - 2 commits - patches/dev300 patches/vba
Noel Power
noelp at kemper.freedesktop.org
Tue Oct 27 10:42:20 PDT 2009
patches/dev300/apply | 2
patches/vba/vba-autofiltermode.diff | 275 ++++++++++++++++++++++++++++++++++++
2 files changed, 276 insertions(+), 1 deletion(-)
New commits:
commit 3420f97f6708365828b5a5065db23c8718819c46
Author: Noel Power <npower at linux-h0uc.site>
Date: Tue Oct 27 17:41:33 2009 +0000
I think it is safe to commit this, enable fix for n#549383
* patches/dev300/apply:
diff --git a/patches/dev300/apply b/patches/dev300/apply
index d9fdacd..156f26d 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -1884,7 +1884,7 @@ vba-styles-add-fix.diff, Fong
vba-financial-functions.diff, n#525633, n#525635, n#525642, n#525647,
vba-typename-fix.diff, n#525649
vba-reenable-rowsourcefixes.diff, n#540960
-#vba-autofiltermode.diff, n#548383
+vba-autofiltermode.diff, n#549383
[VBAUntested]
SectionOwner => noelpwer
# doesn't work
commit 4569c0d0d7cc757d84c7b13b7e4c414be44ffa55
Author: Noel Power <npower at linux-h0uc.site>
Date: Tue Oct 27 17:37:48 2009 +0000
add fix for n#548383 ( commented out for now )
* patches/dev300/apply:
* patches/vba/vba-autofiltermode.diff: add autofiltermode api
diff --git a/patches/dev300/apply b/patches/dev300/apply
index 57a890c..d9fdacd 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -1884,7 +1884,7 @@ vba-styles-add-fix.diff, Fong
vba-financial-functions.diff, n#525633, n#525635, n#525642, n#525647,
vba-typename-fix.diff, n#525649
vba-reenable-rowsourcefixes.diff, n#540960
-
+#vba-autofiltermode.diff, n#548383
[VBAUntested]
SectionOwner => noelpwer
# doesn't work
diff --git a/patches/vba/vba-autofiltermode.diff b/patches/vba/vba-autofiltermode.diff
new file mode 100644
index 0000000..ba55fe1
--- /dev/null
+++ b/patches/vba/vba-autofiltermode.diff
@@ -0,0 +1,275 @@
+diff --git oovbaapi/ooo/vba/excel/XWorksheet.idl oovbaapi/ooo/vba/excel/XWorksheet.idl
+index 1f07f9f..4e037a5 100644
+--- oovbaapi/ooo/vba/excel/XWorksheet.idl
++++ oovbaapi/ooo/vba/excel/XWorksheet.idl
+@@ -64,6 +64,7 @@ interface XWorksheet
+ interface ::com::sun::star::container::XNamed;
+
+ [attribute] boolean Visible;
++ [attribute] boolean AutoFilterMode;
+ [attribute, readonly] long StandardHeight;
+ [attribute, readonly] long StandardWidth;
+ [attribute, readonly] boolean ProtectionMode;
+diff --git sc/source/ui/vba/excelvbahelper.cxx sc/source/ui/vba/excelvbahelper.cxx
+index 49d1e34..9cb844a 100644
+--- sc/source/ui/vba/excelvbahelper.cxx
++++ sc/source/ui/vba/excelvbahelper.cxx
+@@ -44,6 +44,55 @@ namespace vba
+ {
+ namespace excel
+ {
++
++
++uno::Reference< sheet::XDatabaseRanges >
++GetDataBaseRanges( ScDocShell* pShell ) throw ( uno::RuntimeException )
++{
++ uno::Reference< frame::XModel > xModel;
++ if ( pShell )
++ xModel.set( pShell->GetModel(), uno::UNO_QUERY_THROW );
++ uno::Reference< beans::XPropertySet > xModelProps( xModel, uno::UNO_QUERY_THROW );
++ uno::Reference< sheet::XDatabaseRanges > xDBRanges( xModelProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DatabaseRanges") ) ), uno::UNO_QUERY_THROW );
++ return xDBRanges;
++}
++
++// returns the XDatabaseRange for the autofilter on sheet (nSheet)
++// also populates sName with the name of range
++uno::Reference< sheet::XDatabaseRange >
++GetAutoFiltRange( ScDocShell* pShell, sal_Int16 nSheet, rtl::OUString& sName ) throw ( uno::RuntimeException )
++{
++ uno::Reference< container::XIndexAccess > xIndexAccess( GetDataBaseRanges( pShell ), uno::UNO_QUERY_THROW );
++ uno::Reference< sheet::XDatabaseRange > xDataBaseRange;
++ table::CellRangeAddress dbAddress;
++ for ( sal_Int32 index=0; index < xIndexAccess->getCount(); ++index )
++ {
++ uno::Reference< sheet::XDatabaseRange > xDBRange( xIndexAccess->getByIndex( index ), uno::UNO_QUERY_THROW );
++ uno::Reference< container::XNamed > xNamed( xDBRange, uno::UNO_QUERY_THROW );
++ // autofilters work weirdly with openoffice, unnamed is the default
++ // named range which is used to create an autofilter, but
++ // its also possible that another name could be used
++ // this also causes problems when an autofilter is created on
++ // another sheet
++ // ( but.. you can use any named range )
++ dbAddress = xDBRange->getDataArea();
++ if ( dbAddress.Sheet == nSheet )
++ {
++ sal_Bool bHasAuto = sal_False;
++ uno::Reference< beans::XPropertySet > xProps( xDBRange, uno::UNO_QUERY_THROW );
++ xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AutoFilter") ) ) >>= bHasAuto;
++ if ( bHasAuto )
++ {
++ sName = xNamed->getName();
++ xDataBaseRange=xDBRange;
++ break;
++ }
++ }
++ }
++ return xDataBaseRange;
++}
++
++
+ void implSetZoom( const uno::Reference< frame::XModel >& xModel, sal_Int16 nZoom, std::vector< SCTAB >& nTabs )
+ {
+ ScTabViewShell* pViewSh = excel::getBestViewShell( xModel );
+@@ -217,6 +266,7 @@ ScVbaCellRangeAccess::GetDataSet( ScCellRangeObj* pRangeObj )
+ return pDataSet;
+
+ }
++
+ } //excel
+ } //vba
+ } //ooo
+diff --git sc/source/ui/vba/excelvbahelper.hxx sc/source/ui/vba/excelvbahelper.hxx
+index 9c95501..d97721e 100644
+--- sc/source/ui/vba/excelvbahelper.hxx
++++ sc/source/ui/vba/excelvbahelper.hxx
+@@ -32,6 +32,8 @@
+
+ #include<vbahelper/vbahelper.hxx>
+ #include <docsh.hxx>
++#include <com/sun/star/sheet/XDatabaseRanges.hpp>
++#include <com/sun/star/sheet/XDatabaseRange.hpp>
+
+ class ScCellRangeObj;
+
+@@ -51,6 +53,10 @@ namespace ooo
+ ScDocShell* getDocShell( const css::uno::Reference< css::frame::XModel>& xModel ) ;
+ ScTabViewShell* getCurrentBestViewShell( const css::uno::Reference< css::uno::XComponentContext >& xContext );
+ SfxViewFrame* getViewFrame( const css::uno::Reference< css::frame::XModel >& xModel );
++
++ css::uno::Reference< css::sheet::XDatabaseRanges > GetDataBaseRanges( ScDocShell* pShell ) throw ( css::uno::RuntimeException );
++
++ css::uno::Reference< css::sheet::XDatabaseRange > GetAutoFiltRange( ScDocShell* pShell, sal_Int16 nSheet, rtl::OUString& sName ) throw ( css::uno::RuntimeException );
+ class ScVbaCellRangeAccess
+ {
+ public:
+diff --git sc/source/ui/vba/vbarange.cxx sc/source/ui/vba/vbarange.cxx
+index 23c9598..4f68d10 100644
+--- sc/source/ui/vba/vbarange.cxx
++++ sc/source/ui/vba/vbarange.cxx
+@@ -3943,56 +3943,12 @@ ScVbaRange::ApplicationRange( const uno::Reference< uno::XComponentContext >& xC
+ return pRange->Range( Cell1, Cell2, true );
+ }
+
+-uno::Reference< sheet::XDatabaseRanges >
+-lcl_GetDataBaseRanges( ScDocShell* pShell ) throw ( uno::RuntimeException )
+-{
+- uno::Reference< frame::XModel > xModel;
+- if ( pShell )
+- xModel.set( pShell->GetModel(), uno::UNO_QUERY_THROW );
+- uno::Reference< beans::XPropertySet > xModelProps( xModel, uno::UNO_QUERY_THROW );
+- uno::Reference< sheet::XDatabaseRanges > xDBRanges( xModelProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DatabaseRanges") ) ), uno::UNO_QUERY_THROW );
+- return xDBRanges;
+-}
+-// returns the XDatabaseRange for the autofilter on sheet (nSheet)
+-// also populates sName with the name of range
+-uno::Reference< sheet::XDatabaseRange >
+-lcl_GetAutoFiltRange( ScDocShell* pShell, sal_Int16 nSheet, rtl::OUString& sName )
+-{
+- uno::Reference< container::XIndexAccess > xIndexAccess( lcl_GetDataBaseRanges( pShell ), uno::UNO_QUERY_THROW );
+- uno::Reference< sheet::XDatabaseRange > xDataBaseRange;
+- table::CellRangeAddress dbAddress;
+- for ( sal_Int32 index=0; index < xIndexAccess->getCount(); ++index )
+- {
+- uno::Reference< sheet::XDatabaseRange > xDBRange( xIndexAccess->getByIndex( index ), uno::UNO_QUERY_THROW );
+- uno::Reference< container::XNamed > xNamed( xDBRange, uno::UNO_QUERY_THROW );
+- // autofilters work weirdly with openoffice, unnamed is the default
+- // named range which is used to create an autofilter, but
+- // its also possible that another name could be used
+- // this also causes problems when an autofilter is created on
+- // another sheet
+- // ( but.. you can use any named range )
+- dbAddress = xDBRange->getDataArea();
+- if ( dbAddress.Sheet == nSheet )
+- {
+- sal_Bool bHasAuto = sal_False;
+- uno::Reference< beans::XPropertySet > xProps( xDBRange, uno::UNO_QUERY_THROW );
+- xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AutoFilter") ) ) >>= bHasAuto;
+- if ( bHasAuto )
+- {
+- sName = xNamed->getName();
+- xDataBaseRange=xDBRange;
+- break;
+- }
+- }
+- }
+- return xDataBaseRange;
+-}
+
+ // Helper functions for AutoFilter
+ ScDBData* lcl_GetDBData_Impl( ScDocShell* pDocShell, sal_Int16 nSheet )
+ {
+ rtl::OUString sName;
+- lcl_GetAutoFiltRange( pDocShell, nSheet, sName );
++ excel::GetAutoFiltRange( pDocShell, nSheet, sName );
+ OSL_TRACE("lcl_GetDBData_Impl got autofilter range %s for sheet %d",
+ rtl::OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr() , nSheet );
+ ScDBData* pRet = NULL;
+@@ -4159,7 +4115,7 @@ ScVbaRange::AutoFilter( const uno::Any& Field, const uno::Any& Criteria1, const
+ ScDocShell* pShell = getScDocShell();
+ sal_Bool bHasAuto = sal_False;
+ rtl::OUString sAutofiltRangeName;
+- uno::Reference< sheet::XDatabaseRange > xDataBaseRange = lcl_GetAutoFiltRange( pShell, nSheet, sAutofiltRangeName );
++ uno::Reference< sheet::XDatabaseRange > xDataBaseRange = excel::GetAutoFiltRange( pShell, nSheet, sAutofiltRangeName );
+ if ( xDataBaseRange.is() )
+ bHasAuto = true;
+
+@@ -4192,7 +4148,7 @@ ScVbaRange::AutoFilter( const uno::Any& Field, const uno::Any& Criteria1, const
+ autoFiltAddress = multiCellRange.getCellRangeAddressable()->getRangeAddress();
+ }
+
+- uno::Reference< sheet::XDatabaseRanges > xDBRanges = lcl_GetDataBaseRanges( pShell );
++ uno::Reference< sheet::XDatabaseRanges > xDBRanges = excel::GetDataBaseRanges( pShell );
+ if ( xDBRanges.is() )
+ {
+ rtl::OUString sGenName( RTL_CONSTASCII_USTRINGPARAM("VBA_Autofilter_") );
+diff --git sc/source/ui/vba/vbawindow.cxx sc/source/ui/vba/vbawindow.cxx
+index c05b314..a612f59 100644
+--- sc/source/ui/vba/vbawindow.cxx
++++ sc/source/ui/vba/vbawindow.cxx
+@@ -59,7 +59,7 @@ using namespace ::ooo::vba;
+ using namespace ::ooo::vba::excel::XlWindowState;
+
+ // nameExists defined in vbaworksheet.cxx
+-bool nameExists( uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc, ::rtl::OUString & name, SCTAB& nTab ) throw ( lang::IllegalArgumentException );
++bool nameExists( const uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc, const ::rtl::OUString & name, SCTAB& nTab ) throw ( lang::IllegalArgumentException );
+
+ typedef std::hash_map< rtl::OUString,
+ SCTAB, ::rtl::OUStringHash,
+diff --git sc/source/ui/vba/vbaworksheet.cxx sc/source/ui/vba/vbaworksheet.cxx
+index 015e68f..3a38bd3 100644
+--- sc/source/ui/vba/vbaworksheet.cxx
++++ sc/source/ui/vba/vbaworksheet.cxx
+@@ -99,7 +99,7 @@
+ using namespace com::sun::star;
+ using namespace ooo::vba;
+ bool
+-nameExists( uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc, ::rtl::OUString & name, SCTAB& nTab ) throw ( lang::IllegalArgumentException )
++nameExists( const uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc, const ::rtl::OUString & name, SCTAB& nTab ) throw ( lang::IllegalArgumentException )
+ {
+ if (!xSpreadDoc.is())
+ throw lang::IllegalArgumentException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nameExists() xSpreadDoc is null" ) ), uno::Reference< uno::XInterface >(), 1 );
+@@ -993,6 +993,50 @@ ScVbaWorksheet::PrintOut( const uno::Any& From, const uno::Any& To, const uno::A
+ PrintOutHelper( excel::getBestViewShell( xModel ), From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, bSelection );
+ }
+
++uno::Reference< sheet::XDatabaseRange > lcl_getXDatabase( const uno::Reference< frame::XModel >& xModel, const rtl::OUString& aSheetName ) throw ( uno::RuntimeException)
++
++{
++ uno::Reference< sheet::XDatabaseRange > xDBRange;
++ uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( xModel, uno::UNO_QUERY_THROW );
++ SCTAB nTab(0);
++ bool bSheetExists = nameExists (xSpreadDoc, aSheetName, nTab);
++ if ( bSheetExists )
++ {
++ rtl::OUString sAutofilterRngName;
++ ScDocShell* pShell = excel::getDocShell( xModel );
++
++ xDBRange = excel::GetAutoFiltRange( pShell, static_cast< sal_Int16 >( nTab ), sAutofilterRngName );
++
++ }
++ return xDBRange;
++}
++
++::sal_Bool SAL_CALL
++ScVbaWorksheet::getAutoFilterMode() throw (uno::RuntimeException)
++{
++ if ( lcl_getXDatabase( getModel(), getName() ).is() )
++ return sal_True;
++ return sal_False;
++}
++
++void SAL_CALL
++ScVbaWorksheet::setAutoFilterMode( ::sal_Bool _autofiltermode ) throw (uno::RuntimeException)
++{
++ if ( !_autofiltermode )
++ {
++ uno::Reference< sheet::XDatabaseRange >xAutoFilt = lcl_getXDatabase( getModel(), getName() );
++
++ if ( xAutoFilt.is() )
++ {
++ uno::Reference< beans::XPropertySet > xProps( xAutoFilt, uno::UNO_QUERY_THROW );
++ xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AutoFilter") ), uno::makeAny( sal_False ) );
++ }
++ }
++ // Not possible to set to true
++ else
++ throw uno::RuntimeException();
++}
++
+ namespace worksheet
+ {
+ namespace sdecl = comphelper::service_decl;
+diff --git sc/source/ui/vba/vbaworksheet.hxx sc/source/ui/vba/vbaworksheet.hxx
+index cf696a3..3324753 100644
+--- sc/source/ui/vba/vbaworksheet.hxx
++++ sc/source/ui/vba/vbaworksheet.hxx
+@@ -82,6 +82,9 @@ public:
+ { return mxSheet; }
+
+ // Attributes
++ virtual ::sal_Bool SAL_CALL getAutoFilterMode() throw (::com::sun::star::uno::RuntimeException);
++ virtual void SAL_CALL setAutoFilterMode( ::sal_Bool _autofiltermode ) throw (::com::sun::star::uno::RuntimeException);
++
+ virtual ::rtl::OUString SAL_CALL getName() throw (css::uno::RuntimeException);
+ virtual void SAL_CALL setName( const ::rtl::OUString &rName ) throw (css::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL getVisible() throw (css::uno::RuntimeException);
More information about the ooo-build-commit
mailing list