[Libreoffice-commits] .: Branch 'libreoffice-3-4' - 3 commits - sc/inc sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Tue Apr 26 09:35:21 PDT 2011


 sc/inc/document.hxx                 |    6 +--
 sc/source/filter/excel/excimp8.cxx  |   64 +++++++++++-------------------------
 sc/source/filter/excel/excrecds.cxx |   23 ++----------
 sc/source/filter/excel/xiname.cxx   |    2 -
 sc/source/filter/inc/excimp8.hxx    |   15 ++------
 sc/source/ui/vba/vbaworksheet.cxx   |   55 ++++++++++++++++--------------
 sc/source/ui/vba/vbaworksheet.hxx   |    2 -
 7 files changed, 63 insertions(+), 104 deletions(-)

New commits:
commit 71bfd2d196e8a5e433f5335215d8e81ef9d51e21
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Apr 25 22:16:02 2011 +0200

    support export of sheet local anonymous db data to excel binary

diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx
index 0239ac8..619d48a 100644
--- a/sc/source/filter/excel/excrecds.cxx
+++ b/sc/source/filter/excel/excrecds.cxx
@@ -856,31 +856,18 @@ ExcAutoFilterRecs::ExcAutoFilterRecs( const XclExpRoot& rRoot, SCTAB nTab ) :
     pFilterInfo( NULL )
     , mbAutoFilter (false)
 {
-    ScDBCollection& rDBColl = GetDatabaseRanges();
     XclExpNameManager& rNameMgr = GetNameManager();
 
-    // search for first DB-range with filter
-    sal_uInt16		nIndex	= 0;
     sal_Bool		bFound	= false;
     sal_Bool		bAdvanced = false;
-    ScDBData*	pData	= NULL;
+    ScDBData*	pData	= rRoot.GetDoc().GetAnonymousDBData(nTab);
     ScRange		aAdvRange;
-    while( (nIndex < rDBColl.GetCount()) && !bFound )
+    if (pData)
     {
-        pData = rDBColl[ nIndex ];
-        if( pData )
-        {
-            ScRange aRange;
-            pData->GetArea( aRange );
-            bAdvanced = pData->GetAdvancedQuerySource( aAdvRange );
-            bFound = (aRange.aStart.Tab() == nTab) &&
-                (pData->HasQueryParam() || pData->HasAutoFilter() || bAdvanced);
-        }
-        if( !bFound )
-            nIndex++;
+        bAdvanced = pData->GetAdvancedQuerySource( aAdvRange );
+        bFound = (pData->HasQueryParam() || pData->HasAutoFilter() || bAdvanced);
     }
-
-    if( pData && bFound )
+    if( bFound )
     {
         ScQueryParam	aParam;
         pData->GetQueryParam( aParam );
commit caa285d1d40cbe42f4c1d0e1038b4937d1e2cedf
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Apr 25 17:28:03 2011 +0200

    make excel binary import use anonymous db data

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 43a989a..820dd2c 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -528,7 +528,7 @@ public:
     SC_DLLPUBLIC sal_Bool                   SetCodeName( SCTAB nTab, const String& rName );
     SC_DLLPUBLIC sal_Bool			GetTable( const String& rName, SCTAB& rTab ) const;
 
-    void            SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData);
+    SC_DLLPUBLIC void            SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData);
     SC_DLLPUBLIC ScDBData*       GetAnonymousDBData(SCTAB nTab);
 
     SC_DLLPUBLIC inline SCTAB	GetTableCount() const { return nMaxTableNumber; }
diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx
index 40b47cd..cf4abda 100644
--- a/sc/source/filter/excel/excimp8.cxx
+++ b/sc/source/filter/excel/excimp8.cxx
@@ -82,6 +82,7 @@
 #include "attrib.hxx"
 #include "conditio.hxx"
 #include "dbcolect.hxx"
+#include "globalnames.hxx"
 #include "editutil.hxx"
 #include "markdata.hxx"
 #include "rangenam.hxx"
@@ -468,8 +469,6 @@ void ImportExcel8::FilterMode( void )
     // then the latter is true..
     if( !pExcRoot->pAutoFilterBuffer ) return;
 
-    pExcRoot->pAutoFilterBuffer->IncrementActiveAF();
-
     XclImpAutoFilterData* pData = pExcRoot->pAutoFilterBuffer->GetByTab( GetCurrScTab() );
     if( pData )
         pData->SetAutoOrAdvanced();
@@ -498,15 +497,14 @@ void ImportExcel8::AutoFilter( void )
 
 
 
-XclImpAutoFilterData::XclImpAutoFilterData( RootData* pRoot, const ScRange& rRange, const String& rName ) :
+XclImpAutoFilterData::XclImpAutoFilterData( RootData* pRoot, const ScRange& rRange ) :
         ExcRoot( pRoot ),
         pCurrDBData(NULL),
         nFirstEmpty( 0 ),
         bActive( false ),
         bHasConflict( false ),
         bCriteria( false ),
-        bAutoOrAdvanced(false),
-        aFilterName(rName)
+        bAutoOrAdvanced(false)
 {
     aParam.nCol1 = rRange.aStart.Col();
     aParam.nRow1 = rRange.aStart.Row();
@@ -750,9 +748,9 @@ void XclImpAutoFilterData::SetExtractPos( const ScAddress& rAddr )
     aParam.bDestPers = sal_True;
 }
 
-void XclImpAutoFilterData::Apply( const sal_Bool bUseUnNamed )
+void XclImpAutoFilterData::Apply()
 {
-    CreateScDBData(bUseUnNamed);
+    CreateScDBData();
 
     if( bActive )
     {
@@ -774,35 +772,27 @@ void XclImpAutoFilterData::Apply( const sal_Bool bUseUnNamed )
     }
 }
 
-void XclImpAutoFilterData::CreateScDBData( const sal_Bool bUseUnNamed )
+void XclImpAutoFilterData::CreateScDBData()
 {
 
     // Create the ScDBData() object if the AutoFilter is activated
     // or if we need to create the Advanced Filter.
     if( bActive || bCriteria)
     {
-        ScDBCollection& rColl = pExcRoot->pIR->GetDatabaseRanges();
-        pCurrDBData	= rColl.GetDBAtArea( Tab(), StartCol(), StartRow(), EndCol(), EndRow() );
-        if( !pCurrDBData )
+        ScDocument* pDoc = pExcRoot->pIR->GetDocPtr();
+        String aNewName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
+        pCurrDBData = new ScDBData(aNewName , Tab(),
+                                StartCol(),StartRow(), EndCol(),EndRow() );
+        if(bCriteria)
         {
-            AmendAFName(bUseUnNamed);
-
-            pCurrDBData = new ScDBData( aFilterName, Tab(), StartCol(), StartRow(), EndCol(), EndRow() );
-
-            if( pCurrDBData )
-            {
-                if(bCriteria)
-                {
-                    EnableRemoveFilter();
+            EnableRemoveFilter();
 
-                    pCurrDBData->SetQueryParam( aParam );
-                    pCurrDBData->SetAdvancedQuerySource(&aCriteriaRange);
-                }
-                else
-                    pCurrDBData->SetAdvancedQuerySource(NULL);
-                rColl.Insert( pCurrDBData );
-            }
+            pCurrDBData->SetQueryParam( aParam );
+            pCurrDBData->SetAdvancedQuerySource(&aCriteriaRange);
         }
+        else
+            pCurrDBData->SetAdvancedQuerySource(NULL);
+        pDoc->SetAnonymousDBData(Tab(), pCurrDBData);
     }
 
 }
@@ -822,18 +812,7 @@ void XclImpAutoFilterData::EnableRemoveFilter()
     // inside the advanced range
 }
 
-void XclImpAutoFilterData::AmendAFName(const sal_Bool bUseUnNamed)
-{
-    // If-and-only-if we have one AF filter then
-    // use the Calc "unnamed" range name. Calc
-    // only supports one in total while Excel
-    // supports one per sheet.
-    if( bUseUnNamed && bAutoOrAdvanced )
-        aFilterName = ScGlobal::GetRscString(STR_DB_NONAME);
-}
-
-XclImpAutoFilterBuffer::XclImpAutoFilterBuffer() :
-    nAFActiveCount( 0 )
+XclImpAutoFilterBuffer::XclImpAutoFilterBuffer()
 {
 }
 
@@ -843,11 +822,10 @@ XclImpAutoFilterBuffer::~XclImpAutoFilterBuffer()
         delete pData;
 }
 
-void XclImpAutoFilterBuffer::Insert( RootData* pRoot, const ScRange& rRange,
-                                    const String& rName )
+void XclImpAutoFilterBuffer::Insert( RootData* pRoot, const ScRange& rRange)
 {
     if( !GetByTab( rRange.aStart.Tab() ) )
-        Append( new XclImpAutoFilterData( pRoot, rRange, rName ) );
+        Append( new XclImpAutoFilterData( pRoot, rRange) );
 }
 
 void XclImpAutoFilterBuffer::AddAdvancedRange( const ScRange& rRange )
@@ -867,7 +845,7 @@ void XclImpAutoFilterBuffer::AddExtractPos( const ScRange& rRange )
 void XclImpAutoFilterBuffer::Apply()
 {
     for( XclImpAutoFilterData* pData = _First(); pData; pData = _Next() )
-        pData->Apply(UseUnNamed());
+        pData->Apply();
 }
 
 XclImpAutoFilterData* XclImpAutoFilterBuffer::GetByTab( SCTAB nTab )
diff --git a/sc/source/filter/excel/xiname.cxx b/sc/source/filter/excel/xiname.cxx
index eeba8e3..15bf618 100644
--- a/sc/source/filter/excel/xiname.cxx
+++ b/sc/source/filter/excel/xiname.cxx
@@ -186,7 +186,7 @@ XclImpName::XclImpName( XclImpStream& rStrm, sal_uInt16 nXclNameIdx ) :
                 switch( mcBuiltIn )
                 {
                     case EXC_BUILTIN_FILTERDATABASE:
-                        GetFilterManager().Insert( &GetOldRoot(), aRange, maScName );
+                        GetFilterManager().Insert( &GetOldRoot(), aRange);
                     break;
                     case EXC_BUILTIN_CRITERIA:
                         GetFilterManager().AddAdvancedRange( aRange );
diff --git a/sc/source/filter/inc/excimp8.hxx b/sc/source/filter/inc/excimp8.hxx
index a3a721e..274ef95 100644
--- a/sc/source/filter/inc/excimp8.hxx
+++ b/sc/source/filter/inc/excimp8.hxx
@@ -103,7 +103,6 @@ private:
     sal_Bool                        bCriteria;
     sal_Bool                        bAutoOrAdvanced;
     ScRange                     aCriteriaRange;
-    String                      aFilterName;
 
     void						CreateFromDouble( String& rStr, double fVal );
     void						SetCellAttribs();
@@ -114,8 +113,7 @@ protected:
 public:
                                 XclImpAutoFilterData(
                                     RootData* pRoot,
-                                    const ScRange& rRange,
-                                    const String& rName );
+                                    const ScRange& rRange);
 
     inline bool                 IsActive() const    { return bActive; }
     inline bool                 IsFiltered() const  { return bAutoOrAdvanced; }
@@ -131,8 +129,8 @@ public:
     void                        SetAdvancedRange( const ScRange* pRange );
     void						SetExtractPos( const ScAddress& rAddr );
     inline void                 SetAutoOrAdvanced()  { bAutoOrAdvanced = sal_True; }
-    void						Apply( const sal_Bool bUseUnNamed = false );
-    void                        CreateScDBData( const sal_Bool bUseUnNamed );
+    void						Apply();
+    void                        CreateScDBData();
     void                        EnableRemoveFilter();
 };
 
@@ -142,8 +140,6 @@ class XclImpAutoFilterBuffer : private List
 private:
     using                       List::Insert;
 
-    sal_uInt16                      nAFActiveCount;
-
     inline XclImpAutoFilterData* _First()	{ return (XclImpAutoFilterData*) List::First(); }
     inline XclImpAutoFilterData* _Next()	{ return (XclImpAutoFilterData*) List::Next(); }
 
@@ -154,15 +150,12 @@ public:
                                 XclImpAutoFilterBuffer();
     virtual						~XclImpAutoFilterBuffer();
 
-    void						Insert( RootData* pRoot, const ScRange& rRange,
-                                                const String& rName );
+    void						Insert( RootData* pRoot, const ScRange& rRange);
     void						AddAdvancedRange( const ScRange& rRange );
     void						AddExtractPos( const ScRange& rRange );
     void						Apply();
 
     XclImpAutoFilterData*		GetByTab( SCTAB nTab );
-    inline void                 IncrementActiveAF() { nAFActiveCount++; }
-    inline sal_Bool                 UseUnNamed() { return nAFActiveCount == 1; }
 };
 
 #endif
commit be1bdf2d52151f0531a7aa0e0433adcdff536366
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Apr 21 22:01:59 2011 +0200

    make VbaWorksheet Autofilter work with sheet local DBData

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index b58782c..43a989a 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -529,7 +529,7 @@ public:
     SC_DLLPUBLIC sal_Bool			GetTable( const String& rName, SCTAB& rTab ) const;
 
     void            SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData);
-    ScDBData*       GetAnonymousDBData(SCTAB nTab);
+    SC_DLLPUBLIC ScDBData*       GetAnonymousDBData(SCTAB nTab);
 
     SC_DLLPUBLIC inline SCTAB	GetTableCount() const { return nMaxTableNumber; }
     SvNumberFormatterIndexTable* GetFormatExchangeList() const { return pFormatExchangeList; }
@@ -1238,7 +1238,7 @@ public:
     SC_DLLPUBLIC sal_Bool			ApplyFlagsTab( SCCOL nStartCol, SCROW nStartRow,
                                             SCCOL nEndCol, SCROW nEndRow,
                                             SCTAB nTab, sal_Int16 nFlags );
-    sal_Bool			RemoveFlagsTab( SCCOL nStartCol, SCROW nStartRow,
+    SC_DLLPUBLIC sal_Bool			RemoveFlagsTab( SCCOL nStartCol, SCROW nStartRow,
                                             SCCOL nEndCol, SCROW nEndRow,
                                             SCTAB nTab, sal_Int16 nFlags );
 
diff --git a/sc/source/ui/vba/vbaworksheet.cxx b/sc/source/ui/vba/vbaworksheet.cxx
index 87fb2e9..4152fb0 100644
--- a/sc/source/ui/vba/vbaworksheet.cxx
+++ b/sc/source/ui/vba/vbaworksheet.cxx
@@ -108,6 +108,8 @@
 #include "vbasheetobjects.hxx"
 #include "viewuno.hxx"
 
+#include "attrib.hxx"
+
 #define STANDARDWIDTH 2267
 #define STANDARDHEIGHT 427
 #define DOESNOTEXIST -1
@@ -444,38 +446,39 @@ ScVbaWorksheet::setEnableSelection( sal_Int32 nSelection ) throw (uno::RuntimeEx
 
 }
 
-uno::Reference< beans::XPropertySet > ScVbaWorksheet::getFirstDBRangeProperties() throw (uno::RuntimeException)
-{
-    uno::Reference< beans::XPropertySet > xModelProps( mxModel, uno::UNO_QUERY_THROW );
-    uno::Reference< container::XIndexAccess > xDBRangesIA( xModelProps->getPropertyValue(
-        ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DatabaseRanges" ) ) ), uno::UNO_QUERY_THROW );
-
-    for( sal_Int32 nIndex = 0, nCount = xDBRangesIA->getCount(); nIndex < nCount; ++nIndex )
-    {
-        uno::Reference< sheet::XCellRangeReferrer > xDBRange( xDBRangesIA->getByIndex( nIndex ), uno::UNO_QUERY_THROW );
-        // check if the database area is on this sheet
-        uno::Reference< sheet::XCellRangeAddressable > xRangeAddr( xDBRange->getReferredCells(), uno::UNO_QUERY_THROW );
-        if( getSheetID() == xRangeAddr->getRangeAddress().Sheet )
-            return uno::Reference< beans::XPropertySet >( xDBRange, uno::UNO_QUERY_THROW );
-    }
-    return uno::Reference< beans::XPropertySet >();
-}
-
 sal_Bool SAL_CALL ScVbaWorksheet::getAutoFilterMode() throw (uno::RuntimeException)
 {
-    uno::Reference< beans::XPropertySet > xDBRangeProps = getFirstDBRangeProperties();
-    sal_Bool bAutoFilterMode = false;
-    return
-        xDBRangeProps.is() &&
-        (xDBRangeProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AutoFilter" ) ) ) >>= bAutoFilterMode) &&
-        bAutoFilterMode;
+    uno::Reference< frame::XModel > xModel( getModel(), uno::UNO_QUERY_THROW );
+    ScDocument* pDoc = excel::getDocShell( xModel )->GetDocument();
+    ScDBData* pDBData = pDoc->GetAnonymousDBData(getSheetID());
+    if (pDBData)
+        return pDBData->HasAutoFilter();
+    return false;
 }
 
 void SAL_CALL ScVbaWorksheet::setAutoFilterMode( sal_Bool bAutoFilterMode ) throw (uno::RuntimeException)
 {
-    uno::Reference< beans::XPropertySet > xDBRangeProps = getFirstDBRangeProperties();
-    if( xDBRangeProps.is() )
-        xDBRangeProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AutoFilter" ) ), uno::Any( bAutoFilterMode ) );
+    uno::Reference< frame::XModel > xModel( getModel(), uno::UNO_QUERY_THROW );
+    ScDocShell* pDocShell = excel::getDocShell( xModel );
+    ScDocument* pDoc = pDocShell->GetDocument();
+    ScDBData* pDBData = pDoc->GetAnonymousDBData(getSheetID());
+    if (pDBData)
+    {
+        pDBData->SetAutoFilter(bAutoFilterMode);
+        ScRange aRange;
+        pDBData->GetArea(aRange);
+        if (bAutoFilterMode && pDoc)
+            pDoc->ApplyFlagsTab( aRange.aStart.Col(), aRange.aStart.Row(),
+                                    aRange.aEnd.Col(), aRange.aStart.Row(),
+                                    aRange.aStart.Tab(), SC_MF_AUTO );
+        else  if (!bAutoFilterMode && pDoc)
+            pDoc->RemoveFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(),
+                                    aRange.aEnd.Col(), aRange.aStart.Row(),
+                                    aRange.aStart.Tab(), SC_MF_AUTO );
+        ScRange aPaintRange(aRange.aStart, aRange.aEnd);
+        aPaintRange.aEnd.SetRow(aPaintRange.aStart.Row());
+        pDocShell->PostPaint(aPaintRange, PAINT_GRID);
+    }
 }
 
 uno::Reference< excel::XRange >
diff --git a/sc/source/ui/vba/vbaworksheet.hxx b/sc/source/ui/vba/vbaworksheet.hxx
index c9a2425..79f5455 100644
--- a/sc/source/ui/vba/vbaworksheet.hxx
+++ b/sc/source/ui/vba/vbaworksheet.hxx
@@ -72,8 +72,6 @@ class ScVbaWorksheet : public WorksheetImpl_BASE
     css::uno::Reference< css::container::XNameAccess > getFormControls();
     css::uno::Any getControlShape( const rtl::OUString& sName );
     
-    css::uno::Reference< css::beans::XPropertySet > getFirstDBRangeProperties() throw (css::uno::RuntimeException);
-    
 protected:
 
     ScVbaWorksheet( const css::uno::Reference< ov::XHelperInterface >& xParent,  const css::uno::Reference< css::uno::XComponentContext >& xContext );


More information about the Libreoffice-commits mailing list