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

Kohei Yoshida kohei at kemper.freedesktop.org
Mon May 9 11:51:03 PDT 2011


 sc/inc/datauno.hxx                  |   30 +++++++++
 sc/inc/unonames.hxx                 |    1 
 sc/source/ui/docshell/dbdocfun.cxx  |   19 ++++-
 sc/source/ui/inc/dbdocfun.hxx       |    2 
 sc/source/ui/unoobj/datauno.cxx     |  117 +++++++++++++++++++++++++++++++++---
 sc/source/ui/unoobj/docuno.cxx      |    5 +
 sc/source/ui/vba/excelvbahelper.cxx |   43 ++++++-------
 sc/source/ui/vba/excelvbahelper.hxx |    4 -
 sc/source/ui/vba/vbarange.cxx       |   29 ++------
 9 files changed, 191 insertions(+), 59 deletions(-)

New commits:
commit d0b1966c59ae094ebb17a13f9903dbd32db9fb40
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu May 5 17:59:58 2011 +0200

    use sheet local db data in ScVbaRange::Autofilter
    
    Signed-off-by: Kohei Yoshida <kyoshida at novell.com>

diff --git a/sc/inc/unonames.hxx b/sc/inc/unonames.hxx
index fb557be..f826e36 100644
--- a/sc/inc/unonames.hxx
+++ b/sc/inc/unonames.hxx
@@ -48,6 +48,7 @@
 #define SC_UNO_EXTERNALDOCLINKS     "ExternalDocLinks"
 #define SC_UNO_COLLABELRNG			"ColumnLabelRanges"
 #define SC_UNO_DATABASERNG			"DatabaseRanges"
+#define SC_UNO_UNNAMEDDBRNG         "UnnamedDatabaseRanges"
 #define SC_UNO_NAMEDRANGES			"NamedRanges"
 #define SC_UNO_ROWLABELRNG			"RowLabelRanges"
 #define SC_UNO_SHEETLINKS			"SheetLinks"
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 2173320..245de3b 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -255,7 +255,7 @@ sal_Bool ScDBDocFunc::ModifyDBData( const ScDBData& rNewData, sal_Bool /* bApi *
 
 // -----------------------------------------------------------------
 
-sal_Bool ScDBDocFunc::RepeatDB( const String& rDBName, sal_Bool bRecord, sal_Bool bApi )
+sal_Bool ScDBDocFunc::RepeatDB( const String& rDBName, sal_Bool bRecord, sal_Bool bApi, bool bIsUnnamed, SCTAB aTab )
 {
     //!	auch fuer ScDBFunc::RepeatDB benutzen!
 
@@ -263,12 +263,21 @@ sal_Bool ScDBDocFunc::RepeatDB( const String& rDBName, sal_Bool bRecord, sal_Boo
     ScDocument* pDoc = rDocShell.GetDocument();
     if (bRecord && !pDoc->IsUndoEnabled())
         bRecord = false;
-    ScDBCollection*	pColl = pDoc->GetDBCollection();
-    sal_uInt16 nIndex;
-    if ( pColl && pColl->SearchName( rDBName, nIndex ) )
+    ScDBData* pDBData = NULL;
+    if (bIsUnnamed)
     {
-        ScDBData* pDBData = (*pColl)[nIndex];
+        pDBData = pDoc->GetAnonymousDBData( aTab );
+    }
+    else
+    {
+        sal_uInt16 nIndex;
+        ScDBCollection*	pColl = pDoc->GetDBCollection();
+        if ( pColl && pColl->SearchName( rDBName, nIndex ) )
+            pDBData = (*pColl)[nIndex];
+    }
 
+    if ( pDBData )
+    {
         ScQueryParam aQueryParam;
         pDBData->GetQueryParam( aQueryParam );
         sal_Bool bQuery = aQueryParam.GetEntry(0).bDoQuery;
diff --git a/sc/source/ui/inc/dbdocfun.hxx b/sc/source/ui/inc/dbdocfun.hxx
index bf61081..3598662 100644
--- a/sc/source/ui/inc/dbdocfun.hxx
+++ b/sc/source/ui/inc/dbdocfun.hxx
@@ -114,7 +114,7 @@ public:
     sal_Bool			RenameDBRange( const String& rOld, const String& rNew, sal_Bool bApi );
     sal_Bool			ModifyDBData( const ScDBData& rNewData, sal_Bool bApi );	// Name unveraendert
 
-    sal_Bool			RepeatDB( const String& rDBName, sal_Bool bRecord, sal_Bool bApi );
+    sal_Bool			RepeatDB( const String& rDBName, sal_Bool bRecord, sal_Bool bApi, bool bIsUnnamed=false, SCTAB aTab = 0);
 
     sal_Bool			DataPilotUpdate( ScDPObject* pOldObj, const ScDPObject* pNewObj,
                                         sal_Bool bRecord, sal_Bool bApi, sal_Bool bAllowMove = false );
diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 2e021c0..860db1b 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -1908,7 +1908,7 @@ void SAL_CALL ScDatabaseRangeObj::refresh() throw(uno::RuntimeException)
 
         // interne Operationen (sort, query, subtotal) nur, wenn kein Fehler
         if (bContinue)
-            aFunc.RepeatDB( pData->GetName(), sal_True, sal_True );
+            aFunc.RepeatDB( pData->GetName(), true, true, bIsUnnamed, aTab );
     }
 }
 
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index f0e964b..9f4abf5 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -56,6 +56,7 @@
 #include <com/sun/star/util/Date.hpp>
 #include <com/sun/star/sheet/XNamedRanges.hpp>
 #include <com/sun/star/sheet/XLabelRanges.hpp>
+#include <com/sun/star/sheet/XUnnamedDatabaseRanges.hpp>
 #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
 #include <com/sun/star/script/XLibraryContainer.hpp>
 #include <com/sun/star/lang/XInitialization.hpp>
@@ -1780,6 +1781,10 @@ uno::Any SAL_CALL ScModelObj::getPropertyValue( const rtl::OUString& aPropertyNa
         {
             aRet <<= uno::Reference<sheet::XDatabaseRanges>(new ScDatabaseRangesObj( pDocShell ));
         }
+        else if ( aString.EqualsAscii( SC_UNO_UNNAMEDDBRNG ) )
+        {
+            aRet <<= uno::Reference<sheet::XUnnamedDatabaseRanges>(new ScUnnamedDatabaseRangesObj(pDocShell));
+        }
         else if ( aString.EqualsAscii( SC_UNO_COLLABELRNG ) )
         {
             aRet <<= uno::Reference<sheet::XLabelRanges>(new ScLabelRangesObj( pDocShell, sal_True ));
diff --git a/sc/source/ui/vba/excelvbahelper.cxx b/sc/source/ui/vba/excelvbahelper.cxx
index d98f1ac..cbf30eb 100644
--- a/sc/source/ui/vba/excelvbahelper.cxx
+++ b/sc/source/ui/vba/excelvbahelper.cxx
@@ -66,36 +66,33 @@ GetDataBaseRanges( ScDocShell* pShell ) throw ( uno::RuntimeException )
     return xDBRanges;
 }
 
+uno::Reference< sheet::XUnnamedDatabaseRanges >
+GetUnnamedDataBaseRanges( 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::XUnnamedDatabaseRanges > xUnnamedDBRanges( xModelProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UnnamedDatabaseRanges") ) ), uno::UNO_QUERY_THROW );
+    return xUnnamedDBRanges;
+}
+
 // 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 )
+GetAutoFiltRange( ScDocShell* pShell, sal_Int16 nSheet ) throw ( uno::RuntimeException )
 {
-    uno::Reference< container::XIndexAccess > xIndexAccess( GetDataBaseRanges( pShell ), uno::UNO_QUERY_THROW );
+    uno::Reference< sheet::XUnnamedDatabaseRanges > xUnnamedDBRanges( GetUnnamedDataBaseRanges( pShell ), uno::UNO_QUERY_THROW );
     uno::Reference< sheet::XDatabaseRange > xDataBaseRange;
-    table::CellRangeAddress dbAddress;
-    for ( sal_Int32 index=0; index < xIndexAccess->getCount(); ++index )
+    if (xUnnamedDBRanges->hasByTable( nSheet ) )
     {
-        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 )
+        uno::Reference< sheet::XDatabaseRange > xDBRange( xUnnamedDBRanges->getByTable( nSheet ) , uno::UNO_QUERY_THROW );
+        sal_Bool bHasAuto = false;
+        uno::Reference< beans::XPropertySet > xProps( xDBRange, uno::UNO_QUERY_THROW );
+        xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("AutoFilter") ) ) >>= bHasAuto;
+        if ( bHasAuto )
         {
-            sal_Bool bHasAuto = 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;
-            }
+            xDataBaseRange=xDBRange;
         }
     }
     return xDataBaseRange;
diff --git a/sc/source/ui/vba/excelvbahelper.hxx b/sc/source/ui/vba/excelvbahelper.hxx
index bf8ae56..eebeaff 100644
--- a/sc/source/ui/vba/excelvbahelper.hxx
+++ b/sc/source/ui/vba/excelvbahelper.hxx
@@ -32,6 +32,7 @@
 #include "docsh.hxx"
 #include <com/sun/star/sheet/XDatabaseRanges.hpp>
 #include <com/sun/star/sheet/XDatabaseRange.hpp>
+#include <com/sun/star/sheet/XUnnamedDatabaseRanges.hpp>
 #include <com/sun/star/table/XCellRange.hpp>
 #include <com/sun/star/sheet/XSheetCellRangeContainer.hpp>
 #include <com/sun/star/sheet/XSpreadsheet.hpp>
@@ -65,8 +66,9 @@ formula::FormulaGrammar::Grammar GetFormulaGrammar( ScDocument* pDoc, const ScAd
 void CompileExcelFormulaToODF( ScDocument* pDoc, const String& rOldFormula, String& rNewFormula );
 void CompileODFFormulaToExcel( ScDocument* pDoc, const String& rOldFormula, String& rNewFormula, const formula::FormulaGrammar::Grammar eGrammar );
 css::uno::Reference< css::sheet::XDatabaseRanges > GetDataBaseRanges( ScDocShell* pShell ) throw ( css::uno::RuntimeException );
+css::uno::Reference< css::sheet::XUnnamedDatabaseRanges > GetUnnamedDataBaseRanges( 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 );
+css::uno::Reference< css::sheet::XDatabaseRange > GetAutoFiltRange( ScDocShell* pShell, sal_Int16 nSheet ) throw ( css::uno::RuntimeException );
 css::uno::Reference< ooo::vba::XHelperInterface > getUnoSheetModuleObj( const css::uno::Reference< css::sheet::XSpreadsheet >& xSheet ) throw ( css::uno::RuntimeException );
 css::uno::Reference< ooo::vba::XHelperInterface > getUnoSheetModuleObj( const css::uno::Reference< css::sheet::XSheetCellRangeContainer >& xRanges ) throw ( css::uno::RuntimeException );
 css::uno::Reference< ooo::vba::XHelperInterface > getUnoSheetModuleObj( const css::uno::Reference< css::table::XCellRange >& xRange ) throw ( css::uno::RuntimeException );
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx
index 1895c78..1689b13 100644
--- a/sc/source/ui/vba/vbarange.cxx
+++ b/sc/source/ui/vba/vbarange.cxx
@@ -39,6 +39,7 @@
 #include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
 #include <com/sun/star/sheet/XDatabaseRange.hpp>
 #include <com/sun/star/sheet/XDatabaseRanges.hpp>
+#include <com/sun/star/sheet/XUnnamedDatabaseRanges.hpp>
 #include <com/sun/star/sheet/XGoalSeek.hpp>
 #include <com/sun/star/sheet/XSheetOperation.hpp>
 #include <com/sun/star/sheet/CellFlags.hpp>
@@ -4334,20 +4335,10 @@ ScVbaRange::ApplicationRange( const uno::Reference< uno::XComponentContext >& xC
 // Helper functions for AutoFilter
 ScDBData* lcl_GetDBData_Impl( ScDocShell* pDocShell, sal_Int16 nSheet )
 {
-    rtl::OUString 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;
     if (pDocShell)
     {
-        ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
-        if (pNames)
-        {
-            sal_uInt16 nPos = 0;
-            if (pNames->SearchName( sName , nPos ))
-                pRet = (*pNames)[nPos];
-        }
+        pRet = pDocShell->GetDocument()->GetAnonymousDBData(nSheet);
     }
     return pRet;
 }
@@ -4501,8 +4492,7 @@ ScVbaRange::AutoFilter( const uno::Any& Field, const uno::Any& Criteria1, const
     sal_Int16 nSheet = thisAddress.Sheet;
     ScDocShell* pShell = getScDocShell();
     sal_Bool bHasAuto = false;
-    rtl::OUString sAutofiltRangeName;
-    uno::Reference< sheet::XDatabaseRange > xDataBaseRange = excel::GetAutoFiltRange( pShell, nSheet, sAutofiltRangeName );
+    uno::Reference< sheet::XDatabaseRange > xDataBaseRange = excel::GetAutoFiltRange( pShell, nSheet );
     if ( xDataBaseRange.is() )
         bHasAuto = true;
 
@@ -4549,16 +4539,13 @@ ScVbaRange::AutoFilter( const uno::Any& Field, const uno::Any& Criteria1, const
             }
         }
 
-        uno::Reference< sheet::XDatabaseRanges > xDBRanges = excel::GetDataBaseRanges( pShell );
+        uno::Reference< sheet::XUnnamedDatabaseRanges > xDBRanges = excel::GetUnnamedDataBaseRanges( pShell );
         if ( xDBRanges.is() )
         {
-            rtl::OUString sGenName( RTL_CONSTASCII_USTRINGPARAM("VBA_Autofilter_") );
-            sGenName += rtl::OUString::valueOf( static_cast< sal_Int32 >( nSheet ) );
-            OSL_TRACE("Going to add new autofilter range.. name %s",
-                rtl::OUStringToOString( sGenName, RTL_TEXTENCODING_UTF8 ).getStr() , nSheet );
-            if ( !xDBRanges->hasByName( sGenName ) )
-                xDBRanges->addNewByName(  sGenName, autoFiltAddress );
-            xDataBaseRange.set( xDBRanges->getByName(  sGenName ), uno::UNO_QUERY_THROW );
+            OSL_TRACE("Going to add new autofilter range.. sheet %i", nSheet );
+            if ( !xDBRanges->hasByTable( nSheet ) )
+                xDBRanges->setByTable( autoFiltAddress );
+            xDataBaseRange.set( xDBRanges->getByTable(nSheet ), uno::UNO_QUERY_THROW );
         }
         if ( !xDataBaseRange.is() )
             throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Failed to find the autofilter placeholder range" ) ), uno::Reference< uno::XInterface >() );
commit b433b34c2cc5877d658b6970b67702d400f83482
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu May 5 14:25:42 2011 +0200

    check for less equal, not greater equal
    
    Signed-off-by: Kohei Yoshida <kyoshida at novell.com>

diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 9a4f5a0..2e021c0 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -2406,7 +2406,7 @@ void ScUnnamedDatabaseRangesObj::setByTable( const table::CellRangeAddress& aRan
     bool bDone = false;
     if (pDocShell)
     {
-        if ( pDocShell->GetDocument()->GetTableCount() >= aRange.Sheet )
+        if ( pDocShell->GetDocument()->GetTableCount() <= aRange.Sheet )
             throw lang::IndexOutOfBoundsException();
 
         ScDBDocFunc aFunc(*pDocShell);
@@ -2427,7 +2427,7 @@ uno::Any ScUnnamedDatabaseRangesObj::getByTable( const sal_Int32 nTab )
     SolarMutexGuard aGuard;
     if (pDocShell)
     {
-        if ( pDocShell->GetDocument()->GetTableCount() >= nTab )
+        if ( pDocShell->GetDocument()->GetTableCount() <= nTab )
             throw lang::IndexOutOfBoundsException();
         uno::Reference<sheet::XDatabaseRange> xRange( new ScDatabaseRangeObj(pDocShell, (SCTAB) nTab) );
         if (xRange.is())
@@ -2446,7 +2446,7 @@ sal_Bool ScUnnamedDatabaseRangesObj::hasByTable( sal_Int32 nTab )
     SolarMutexGuard aGuard;
     if (pDocShell)
     {
-         if (pDocShell->GetDocument()->GetTableCount() >= nTab)
+         if (pDocShell->GetDocument()->GetTableCount() <= nTab)
             throw lang::IndexOutOfBoundsException();
         if (pDocShell->GetDocument()->GetAnonymousDBData((SCTAB) nTab))
             return true;
commit 9bb51147c10238a3b618593a48cb795132fd70cf
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed May 4 20:12:41 2011 +0200

    add implementation for new uno interface XUnnamedDatabaseRange
    
    Signed-off-by: Kohei Yoshida <kyoshida at novell.com>

diff --git a/sc/inc/datauno.hxx b/sc/inc/datauno.hxx
index 429ca3a..7d43e4f 100644
--- a/sc/inc/datauno.hxx
+++ b/sc/inc/datauno.hxx
@@ -40,6 +40,7 @@
 #include <com/sun/star/sheet/XConsolidationDescriptor.hpp>
 #include <com/sun/star/sheet/XDatabaseRanges.hpp>
 #include <com/sun/star/sheet/XDatabaseRange.hpp>
+#include <com/sun/star/sheet/XUnnamedDatabaseRanges.hpp>
 #include <com/sun/star/sheet/XSubTotalDescriptor.hpp>
 #include <com/sun/star/sheet/XSubTotalField.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
@@ -501,6 +502,8 @@ private:
     String					aName;
     SfxItemPropertySet		aPropSet;
     XDBRefreshListenerArr_Impl aRefreshListeners;
+    bool                    bIsUnnamed;
+    SCTAB                   aTab;
 
 private:
     ScDBData*				GetDBData_Impl() const;
@@ -508,6 +511,7 @@ private:
 
 public:
                             ScDatabaseRangeObj(ScDocShell* pDocSh, const String& rNm);
+                            ScDatabaseRangeObj(ScDocShell* pDocSh, const SCTAB nTab);
     virtual					~ScDatabaseRangeObj();
 
     virtual void			Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
@@ -662,6 +666,32 @@ public:
                                 throw(::com::sun::star::uno::RuntimeException);
 };
 
+class ScUnnamedDatabaseRangesObj : public cppu::WeakImplHelper1<
+                                com::sun::star::sheet::XUnnamedDatabaseRanges>,
+                            public SfxListener
+{
+private:
+    ScDocShell*				pDocShell;
+
+public:
+                            ScUnnamedDatabaseRangesObj(ScDocShell* pDocSh);
+    virtual					~ScUnnamedDatabaseRangesObj();
+
+    virtual void			Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
+
+                            // XUnnamedDatabaseRanges
+    virtual void SAL_CALL setByTable( const ::com::sun::star::table::CellRangeAddress& aRange )
+                                throw(::com::sun::star::uno::RuntimeException,
+                                      ::com::sun::star::lang::IndexOutOfBoundsException );
+    virtual com::sun::star::uno::Any SAL_CALL getByTable( const sal_Int32 nTab )
+                                throw(::com::sun::star::uno::RuntimeException,
+                                ::com::sun::star::lang::IndexOutOfBoundsException,
+                                ::com::sun::star::container::NoSuchElementException );
+    virtual sal_Bool SAL_CALL hasByTable( sal_Int32 nTab )
+                                throw (::com::sun::star::uno::RuntimeException,
+                                ::com::sun::star::lang::IndexOutOfBoundsException);
+};
+
 
 
 #endif
diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index edc7fea..9a4f5a0 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -57,6 +57,7 @@
 #include "docsh.hxx"
 #include "dbdocfun.hxx"
 #include "unonames.hxx"
+#include "globalnames.hxx"
 #include "globstr.hrc"
 #include "convuno.hxx"
 #include "hints.hxx"
@@ -1607,7 +1608,18 @@ void ScDataPilotFilterDescriptor::PutData( const ScQueryParam& rParam )
 ScDatabaseRangeObj::ScDatabaseRangeObj(ScDocShell* pDocSh, const String& rNm) :
     pDocShell( pDocSh ),
     aName( rNm ),
-    aPropSet( lcl_GetDBRangePropertyMap() )
+    aPropSet( lcl_GetDBRangePropertyMap() ),
+    bIsUnnamed(false)
+{
+    pDocShell->GetDocument()->AddUnoObject(*this);
+}
+
+ScDatabaseRangeObj::ScDatabaseRangeObj(ScDocShell* pDocSh, const SCTAB nTab) :
+    pDocShell( pDocSh ),
+    aName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)),
+    aPropSet( lcl_GetDBRangePropertyMap() ),
+    bIsUnnamed(true),
+    aTab( nTab )
 {
     pDocShell->GetDocument()->AddUnoObject(*this);
 }
@@ -1641,12 +1653,19 @@ ScDBData* ScDatabaseRangeObj::GetDBData_Impl() const
     ScDBData* pRet = NULL;
     if (pDocShell)
     {
-        ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
-        if (pNames)
+        if (bIsUnnamed)
         {
-            sal_uInt16 nPos = 0;
-            if (pNames->SearchName( aName, nPos ))
-                pRet = (*pNames)[nPos];
+            pRet = pDocShell->GetDocument()->GetAnonymousDBData(aTab);
+        }
+        else
+        {
+            ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
+            if (pNames)
+            {
+                sal_uInt16 nPos = 0;
+                if (pNames->SearchName( aName, nPos ))
+                    pRet = (*pNames)[nPos];
+            }
         }
     }
     return pRet;
@@ -2079,7 +2098,7 @@ uno::Any SAL_CALL ScDatabaseRangeObj::getPropertyValue( const rtl::OUString& aPr
         {
             //	all database ranges except "unnamed" are user defined
             ScUnoHelpFunctions::SetBoolInAny( aRet,
-                        ( pData->GetName() != ScGlobal::GetRscString(STR_DB_NONAME) ) );
+                        ( pData->GetName() != String(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME))  ) );
         }
         else if ( aString.EqualsAscii( SC_UNO_LINKDISPBIT ) )
         {
@@ -2354,8 +2373,90 @@ sal_Bool SAL_CALL ScDatabaseRangesObj::hasByName( const rtl::OUString& aName )
 
 //------------------------------------------------------------------------
 
+ScUnnamedDatabaseRangesObj::ScUnnamedDatabaseRangesObj(ScDocShell* pDocSh) :
+    pDocShell( pDocSh )
+{
+    pDocShell->GetDocument()->AddUnoObject(*this);
+}
+
+ScUnnamedDatabaseRangesObj::~ScUnnamedDatabaseRangesObj()
+{
+    if (pDocShell)
+        pDocShell->GetDocument()->RemoveUnoObject(*this);
+}
+
+void ScUnnamedDatabaseRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
+{
+    //	Referenz-Update interessiert hier nicht
+
+    if ( rHint.ISA( SfxSimpleHint ) &&
+            ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
+    {
+        pDocShell = NULL;		// ungueltig geworden
+    }
+}
+
+// XUnnamedDatabaseRanges
+
+void ScUnnamedDatabaseRangesObj::setByTable( const table::CellRangeAddress& aRange )
+                                throw( uno::RuntimeException,
+                                        lang::IndexOutOfBoundsException )
+{
+    SolarMutexGuard aGuard;
+    bool bDone = false;
+    if (pDocShell)
+    {
+        if ( pDocShell->GetDocument()->GetTableCount() >= aRange.Sheet )
+            throw lang::IndexOutOfBoundsException();
 
+        ScDBDocFunc aFunc(*pDocShell);
+        String aString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
+        ScRange aUnnamedRange( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
+                            (SCCOL)aRange.EndColumn,   (SCROW)aRange.EndRow,   aRange.Sheet );
+        bDone = aFunc.AddDBRange( aString, aUnnamedRange, sal_True );
+    }
+    if (!bDone)
+        throw uno::RuntimeException();		// no other exceptions specified
+}
 
+uno::Any ScUnnamedDatabaseRangesObj::getByTable( const sal_Int32 nTab )
+                                throw(uno::RuntimeException,
+                                    lang::IndexOutOfBoundsException,
+                                    container::NoSuchElementException)
+{
+    SolarMutexGuard aGuard;
+    if (pDocShell)
+    {
+        if ( pDocShell->GetDocument()->GetTableCount() >= nTab )
+            throw lang::IndexOutOfBoundsException();
+        uno::Reference<sheet::XDatabaseRange> xRange( new ScDatabaseRangeObj(pDocShell, (SCTAB) nTab) );
+        if (xRange.is())
+            return uno::makeAny(xRange);
+        else
+            throw container::NoSuchElementException();
+    }
+    else
+        throw uno::RuntimeException();
+}
+
+sal_Bool ScUnnamedDatabaseRangesObj::hasByTable( sal_Int32 nTab )
+                                    throw (uno::RuntimeException,
+                                        lang::IndexOutOfBoundsException)
+{
+    SolarMutexGuard aGuard;
+    if (pDocShell)
+    {
+         if (pDocShell->GetDocument()->GetTableCount() >= nTab)
+            throw lang::IndexOutOfBoundsException();
+        if (pDocShell->GetDocument()->GetAnonymousDBData((SCTAB) nTab))
+            return true;
+        return false;
+    }
+    else
+        return false;
+}
+
+//------------------------------------------------------------------------
 
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list