summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/dbcolect.hxx10
-rw-r--r--sc/inc/document.hxx4
-rw-r--r--sc/inc/globalnames.hxx34
-rw-r--r--sc/inc/rangeutl.hxx1
-rw-r--r--sc/inc/table.hxx6
-rw-r--r--sc/source/core/data/document.cxx28
-rw-r--r--sc/source/core/data/table1.cxx17
-rw-r--r--sc/source/core/data/table2.cxx4
-rw-r--r--sc/source/core/tool/dbcolect.cxx209
-rw-r--r--sc/source/core/tool/rangeutl.cxx10
-rw-r--r--sc/source/filter/xml/XMLExportDatabaseRanges.cxx27
-rw-r--r--sc/source/filter/xml/xmldrani.cxx30
-rw-r--r--sc/source/ui/dbgui/dbnamdlg.cxx7
-rw-r--r--sc/source/ui/dbgui/foptmgr.cxx3
-rw-r--r--sc/source/ui/dbgui/pfiltdlg.cxx4
-rw-r--r--sc/source/ui/dbgui/tpsort.cxx4
-rw-r--r--sc/source/ui/docshell/dbdocfun.cxx33
-rw-r--r--sc/source/ui/docshell/docsh5.cxx85
-rw-r--r--sc/source/ui/inc/pfiltdlg.hxx1
-rw-r--r--sc/source/ui/inc/tpsort.hxx1
-rw-r--r--sc/source/ui/inc/undobase.hxx1
-rw-r--r--sc/source/ui/navipi/content.cxx4
-rw-r--r--sc/source/ui/undo/undobase.cxx14
-rw-r--r--sc/source/ui/undo/undodat.cxx19
-rw-r--r--sc/source/ui/undo/undoutil.cxx15
-rw-r--r--sc/source/ui/unoobj/datauno.cxx114
-rw-r--r--sc/source/ui/view/cellsh2.cxx5
27 files changed, 475 insertions, 215 deletions
diff --git a/sc/inc/dbcolect.hxx b/sc/inc/dbcolect.hxx
index d56adcbb17b1..251325715d06 100644
--- a/sc/inc/dbcolect.hxx
+++ b/sc/inc/dbcolect.hxx
@@ -176,6 +176,13 @@ public:
sal_Bool IsModified() const { return bModified; }
void SetModified(sal_Bool bMod) { bModified = bMod; }
+
+ void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
+ void UpdateReference(UpdateRefMode eUpdateRefMode,
+ SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
+ SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+ ScDocument* pDoc );
};
@@ -206,6 +213,7 @@ public:
virtual sal_Bool IsEqual(ScDataObject* pKey1, ScDataObject* pKey2) const;
ScDBData* GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool bStartOnly) const;
ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const;
+ ScDBData* GetDBNearCursor(SCCOL nCol, SCROW nRow, SCTAB nTab );
sal_Bool SearchName( const String& rName, sal_uInt16& rIndex ) const;
@@ -213,7 +221,7 @@ public:
void UpdateReference(UpdateRefMode eUpdateRefMode,
SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
- SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
+ SCsCOL nDx, SCsROW nDy, SCsTAB nDz);
void UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
ScDBData* FindIndex(sal_uInt16 nIndex);
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 1a125ef81155..6127f5b39c4f 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -525,6 +525,10 @@ public:
SC_DLLPUBLIC sal_Bool GetCodeName( SCTAB nTab, String& rName ) const;
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);
+ ScDBData* GetAnonymousDBData(SCTAB nTab);
+
SC_DLLPUBLIC inline SCTAB GetTableCount() const { return nMaxTableNumber; }
SvNumberFormatterIndexTable* GetFormatExchangeList() const { return pFormatExchangeList; }
diff --git a/sc/inc/globalnames.hxx b/sc/inc/globalnames.hxx
new file mode 100644
index 000000000000..6fb983a6cadf
--- /dev/null
+++ b/sc/inc/globalnames.hxx
@@ -0,0 +1,34 @@
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ * Markus Mohrhard <markus.mohrhard@googlemail.com>
+ * Portions created by the Initial Developer are Copyright (C) 2010 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Kohei Yoshida <kyoshida@novell.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#ifndef __SC_GLOBALNAMES_HXX__
+#define __SC_GLOBALNAMES_HXX__
+
+#define STR_DB_LOCAL_NONAME "unnamed"
+#define STR_DB_GLOBAL_NONAME "unnamed"
+
+#endif
diff --git a/sc/inc/rangeutl.hxx b/sc/inc/rangeutl.hxx
index 716a93e66c68..96382e2d528c 100644
--- a/sc/inc/rangeutl.hxx
+++ b/sc/inc/rangeutl.hxx
@@ -304,7 +304,6 @@ public:
class SC_DLLPUBLIC ScAreaNameIterator
{
private:
- String aStrNoName;
ScRangeName* pRangeName;
ScRangeName::const_iterator maRNPos;
ScRangeName::const_iterator maRNEnd;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index a4be4abff773..d3be0754dec4 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -38,6 +38,7 @@
#include "column.hxx"
#include "sortparam.hxx"
#include "compressedarray.hxx"
+#include "dbcolect.hxx"
#include <memory>
#include <set>
@@ -187,6 +188,7 @@ private:
Color aTabBgColor;
sal_uInt16 nScenarioFlags;
sal_Bool bActiveScenario;
+ ScDBData* pDBDataNoName;
mutable ScRangeName* mpRangeName;
bool mbPageBreaksValid;
@@ -270,6 +272,9 @@ public:
void GetName( String& rName ) const;
void SetName( const String& rNewName );
+ void SetAnonymousDBData(ScDBData* aDBData);
+ ScDBData* GetAnonymousDBData();
+
void GetCodeName( String& rName ) const { rName = aCodeName; }
void SetCodeName( const String& rNewName ) { aCodeName = rNewName; }
@@ -795,6 +800,7 @@ public:
void SetRangeName(ScRangeName* pNew);
ScRangeName* GetRangeName() const;
+ void UpdateMoveTab(SCTAB nOldPos,SCTAB nNewPos);
private:
void FillSeries( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 4e4ff49792d2..8d236383dac2 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -218,6 +218,16 @@ sal_Bool ScDocument::GetTable( const String& rName, SCTAB& rTab ) const
return false;
}
+ScDBData* ScDocument::GetAnonymousDBData(SCTAB nTab)
+{
+ return pTab[nTab]->GetAnonymousDBData();
+}
+
+void ScDocument::SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData)
+{
+ pTab[nTab]->SetAnonymousDBData(pDBData);
+}
+
bool ScDocument::ValidTabName( const String& rName )
{
@@ -4843,6 +4853,24 @@ sal_Bool ScDocument::RefreshAutoFilter( SCCOL nStartCol, SCROW nStartRow,
}
}
}
+ if (pTab[nTab])
+ pData = pTab[nTab]->GetAnonymousDBData();
+ else
+ pData=NULL;
+ if (pData)
+ {
+ if (pData->HasAutoFilter())
+ {
+ pData->GetArea( nDBTab, nDBStartCol,nDBStartRow, nDBEndCol,nDBEndRow );
+ if ( nDBTab==nTab && nDBStartRow<=nEndRow && nDBEndRow>=nStartRow &&
+ nDBStartCol<=nEndCol && nDBEndCol>=nStartCol )
+ {
+ if (ApplyFlagsTab( nDBStartCol,nDBStartRow, nDBEndCol,nDBStartRow,
+ nDBTab, SC_MF_AUTO ))
+ bChange = sal_True;
+ }
+ }
+ }
return bChange;
}
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 74d7965bfb70..b14e847f9fa8 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -272,6 +272,7 @@ ScTable::ScTable( ScDocument* pDoc, SCTAB nNewTab, const String& rNewName,
aTabBgColor( COL_AUTO ),
nScenarioFlags( 0 ),
bActiveScenario( false ),
+ pDBDataNoName(NULL),
mpRangeName(NULL),
mbPageBreaksValid(false)
{
@@ -341,6 +342,7 @@ ScTable::~ScTable()
delete pRepeatRowRange;
delete pScenarioRanges;
delete mpRangeName;
+ delete pDBDataNoName;
DestroySortCollator();
}
@@ -1433,6 +1435,8 @@ void ScTable::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo,
if (IsStreamValid())
SetStreamValid(false);
+ if (pDBDataNoName)
+ pDBDataNoName->UpdateMoveTab(nOldPos, nNewPos);
}
void ScTable::UpdateCompile( sal_Bool bForceIfNameInUse )
@@ -1807,4 +1811,17 @@ SCROW ScTable::VisibleDataCellIterator::getRow() const
return mnCurRow;
}
+void ScTable::SetAnonymousDBData(ScDBData* aDBData)
+{
+ //don't delete old dbdata, will still be used by undo/redo
+ if (!(rtl::OUString(aDBData->GetName()) == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("unnamed"))))
+ OSL_FAIL("Falscher Name für lokale DB");
+ pDBDataNoName = aDBData;
+}
+
+ScDBData* ScTable::GetAnonymousDBData()
+{
+ return pDBDataNoName;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 69e059ce6b3c..7293cf1eed04 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -472,6 +472,8 @@ void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
pTable->CopyColHidden(*this, 0, nCol2);
pTable->CopyColFiltered(*this, 0, nCol2);
+ if (pDBDataNoName)
+ pTable->SetAnonymousDBData(new ScDBData(*pDBDataNoName));
if (pRowFlags && pTable->pRowFlags && mpRowHeights && pTable->mpRowHeights)
{
@@ -759,6 +761,8 @@ void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
if (!bColRowFlags) // Spaltenbreiten/Zeilenhoehen/Flags
return;
+ if (pDBDataNoName)
+ pDestTab->SetAnonymousDBData(new ScDBData(*pDBDataNoName));
// Charts muessen beim Ein-/Ausblenden angepasst werden
ScChartListenerCollection* pCharts = pDestTab->pDocument->GetChartListenerCollection();
diff --git a/sc/source/core/tool/dbcolect.cxx b/sc/source/core/tool/dbcolect.cxx
index c6b24faa17a3..8159cb2b6fec 100644
--- a/sc/source/core/tool/dbcolect.cxx
+++ b/sc/source/core/tool/dbcolect.cxx
@@ -35,6 +35,7 @@
#include "dbcolect.hxx"
#include "global.hxx"
+#include "globalnames.hxx"
#include "refupdat.hxx"
#include "rechead.hxx"
#include "document.hxx"
@@ -579,7 +580,79 @@ ScDataObject* ScDBData::Clone() const
return new ScDBData(*this);
}
+void ScDBData::UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos)
+{
+ ScRange aRange;
+ GetArea( aRange );
+ SCTAB nTab = aRange.aStart.Tab(); // hat nur eine Tabelle
+
+ // anpassen wie die aktuelle Tabelle bei ScTablesHint (tabvwsh5.cxx)
+
+ if ( nTab == nOldPos ) // verschobene Tabelle
+ nTab = nNewPos;
+ else if ( nOldPos < nNewPos ) // nach hinten verschoben
+ {
+ if ( nTab > nOldPos && nTab <= nNewPos ) // nachrueckender Bereich
+ --nTab;
+ }
+ else // nach vorne verschoben
+ {
+ if ( nTab >= nNewPos && nTab < nOldPos ) // nachrueckender Bereich
+ ++nTab;
+ }
+
+ sal_Bool bChanged = ( nTab != aRange.aStart.Tab() );
+ if (bChanged)
+ SetArea( nTab, aRange.aStart.Col(), aRange.aStart.Row(),
+ aRange.aEnd.Col(),aRange.aEnd .Row() );
+ // MoveTo ist nicht noetig, wenn nur die Tabelle geaendert ist
+
+ SetModified(bChanged);
+
+}
+
+void ScDBData::UpdateReference(UpdateRefMode eUpdateRefMode,
+ SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
+ SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
+ SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
+ ScDocument* pDoc )
+{
+ SCCOL theCol1;
+ SCROW theRow1;
+ SCTAB theTab1;
+ SCCOL theCol2;
+ SCROW theRow2;
+ SCTAB theTab2;
+ GetArea( theTab1, theCol1, theRow1, theCol2, theRow2 );
+ theTab2 = theTab1;
+
+ sal_Bool bDoUpdate = ScRefUpdate::Update( pDoc, eUpdateRefMode,
+ nCol1,nRow1,nTab1, nCol2,nRow2,nTab2, nDx,nDy,nDz,
+ theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) != UR_NOTHING;
+ if (bDoUpdate)
+ MoveTo( theTab1, theCol1, theRow1, theCol2, theRow2 );
+
+ ScRange aRangeAdvSource;
+ if ( GetAdvancedQuerySource(aRangeAdvSource) )
+ {
+ aRangeAdvSource.GetVars( theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 );
+ if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
+ nCol1,nRow1,nTab1, nCol2,nRow2,nTab2, nDx,nDy,nDz,
+ theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) )
+ {
+ aRangeAdvSource.aStart.Set( theCol1,theRow1,theTab1 );
+ aRangeAdvSource.aEnd.Set( theCol2,theRow2,theTab2 );
+ SetAdvancedQuerySource( &aRangeAdvSource );
+
+ bDoUpdate = sal_True; // DBData is modified
+ }
+ }
+
+ SetModified(bDoUpdate);
+
+ //! Testen, ob mitten aus dem Bereich geloescht/eingefuegt wurde !!!
+}
//---------------------------------------------------------------------------------------
// Compare zum Sortieren
@@ -599,46 +672,46 @@ sal_Bool ScDBCollection::IsEqual(ScDataObject* pKey1, ScDataObject* pKey2) const
ScDBData* ScDBCollection::GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool bStartOnly) const
{
- ScDBData* pNoNameData = NULL;
+ ScDBData* pNoNameData = pDoc->GetAnonymousDBData(nTab);
if (pItems)
{
- const String& rNoName = ScGlobal::GetRscString( STR_DB_NONAME );
-
for (sal_uInt16 i = 0; i < nCount; i++)
+ {
if (((ScDBData*)pItems[i])->IsDBAtCursor(nCol, nRow, nTab, bStartOnly))
{
ScDBData* pDB = (ScDBData*)pItems[i];
- if ( pDB->GetName() == rNoName )
- pNoNameData = pDB;
- else
- return pDB;
+ return pDB; //return AnonymousDBData only if nothing else was found
}
+ }
}
- return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden
+ if (pNoNameData)
+ if (pNoNameData->IsDBAtCursor(nCol,nRow,nTab,bStartOnly))
+ return pNoNameData;
+ return NULL;
}
ScDBData* ScDBCollection::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
{
- ScDBData* pNoNameData = NULL;
+ ScDBData* pNoNameData = pDoc->GetAnonymousDBData(nTab);
if (pItems)
{
- const String& rNoName = ScGlobal::GetRscString( STR_DB_NONAME );
-
for (sal_uInt16 i = 0; i < nCount; i++)
if (((ScDBData*)pItems[i])->IsDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2))
{
ScDBData* pDB = (ScDBData*)pItems[i];
- if ( pDB->GetName() == rNoName )
- pNoNameData = pDB;
- else
- return pDB;
+ return pDB; //return AnonymousDBData only if nothing else was found
}
}
- return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden
+ if (pNoNameData)
+ if (pNoNameData->IsDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2))
+ return pNoNameData;
+ return NULL;
}
sal_Bool ScDBCollection::SearchName( const String& rName, sal_uInt16& rIndex ) const
{
+ if (rtl::OUString(rName)==rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)))
+ DBG_ASSERT(false,"search for noname string");
ScDBData aDataObj( rName, 0,0,0,0,0 );
return Search( &aDataObj, rIndex );
}
@@ -668,40 +741,25 @@ void ScDBCollection::UpdateReference(UpdateRefMode eUpdateRefMode,
{
for (sal_uInt16 i=0; i<nCount; i++)
{
- SCCOL theCol1;
- SCROW theRow1;
- SCTAB theTab1;
- SCCOL theCol2;
- SCROW theRow2;
- SCTAB theTab2;
- ((ScDBData*)pItems[i])->GetArea( theTab1, theCol1, theRow1, theCol2, theRow2 );
- theTab2 = theTab1;
-
- sal_Bool bDoUpdate = ScRefUpdate::Update( pDoc, eUpdateRefMode,
- nCol1,nRow1,nTab1, nCol2,nRow2,nTab2, nDx,nDy,nDz,
- theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) != UR_NOTHING;
- if (bDoUpdate)
- ((ScDBData*)pItems[i])->MoveTo( theTab1, theCol1, theRow1, theCol2, theRow2 );
-
- ScRange aAdvSource;
- if ( ((ScDBData*)pItems[i])->GetAdvancedQuerySource(aAdvSource) )
+ ((ScDBData*)pItems[i])->UpdateReference(eUpdateRefMode,
+ nCol1, nRow1, nTab1,
+ nCol2, nRow2, nTab2,
+ nDx, nDy, nDz, pDoc);
+ }
+ ScDBData* pData = pDoc->GetAnonymousDBData(nTab1);
+ if (pData)
+ {
+ if (nTab1==nTab2&&nDz==0)
{
- aAdvSource.GetVars( theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 );
- if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
- nCol1,nRow1,nTab1, nCol2,nRow2,nTab2, nDx,nDy,nDz,
- theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) )
- {
- aAdvSource.aStart.Set( theCol1,theRow1,theTab1 );
- aAdvSource.aEnd.Set( theCol2,theRow2,theTab2 );
- ((ScDBData*)pItems[i])->SetAdvancedQuerySource( &aAdvSource );
-
- bDoUpdate = sal_True; // DBData is modified
- }
+ pData->UpdateReference(eUpdateRefMode,
+ nCol1, nRow1, nTab1,
+ nCol2, nRow2, nTab2,
+ nDx, nDy, nDz, pDoc);
+ }
+ else
+ {
+ //this will perhabs break undo
}
-
- ((ScDBData*)pItems[i])->SetModified(bDoUpdate);
-
- //! Testen, ob mitten aus dem Bereich geloescht/eingefuegt wurde !!!
}
}
@@ -712,34 +770,8 @@ void ScDBCollection::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos )
for (sal_uInt16 i=0; i<nCount; i++)
{
- ScRange aRange;
ScDBData* pData = (ScDBData*)pItems[i];
- pData->GetArea( aRange );
- SCTAB nTab = aRange.aStart.Tab(); // hat nur eine Tabelle
-
- // anpassen wie die aktuelle Tabelle bei ScTablesHint (tabvwsh5.cxx)
-
- if ( nTab == nOldPos ) // verschobene Tabelle
- nTab = nNewPos;
- else if ( nOldPos < nNewPos ) // nach hinten verschoben
- {
- if ( nTab > nOldPos && nTab <= nNewPos ) // nachrueckender Bereich
- --nTab;
- }
- else // nach vorne verschoben
- {
- if ( nTab >= nNewPos && nTab < nOldPos ) // nachrueckender Bereich
- ++nTab;
- }
-
- sal_Bool bChanged = ( nTab != aRange.aStart.Tab() );
- if (bChanged)
- pData->SetArea( nTab, aRange.aStart.Col(), aRange.aStart.Row(),
- aRange.aEnd.Col(),aRange.aEnd .Row() );
-
- // MoveTo ist nicht noetig, wenn nur die Tabelle geaendert ist
-
- pData->SetModified(bChanged);
+ pData->UpdateMoveTab(nOldPos, nNewPos);
}
}
@@ -770,7 +802,32 @@ sal_Bool ScDBCollection::Insert(ScDataObject* pScDataObject)
return bInserted;
}
-
+ScDBData* ScDBCollection::GetDBNearCursor(SCCOL nCol, SCROW nRow, SCTAB nTab )
+{
+ ScDBData* pNearData = NULL;
+ SCTAB nAreaTab;
+ SCCOL nStartCol, nEndCol;
+ SCROW nStartRow, nEndRow;
+ for (sal_uInt16 i = 0; i < nCount; i++)
+ {
+ ScDBData* pDB = (ScDBData*)pItems[i];
+ pDB->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow );
+ if ( nTab == nAreaTab && nCol+1 >= nStartCol && nCol <= nEndCol+1 &&
+ nRow+1 >= nStartRow && nRow <= nEndRow+1 )
+ {
+ if ( nCol < nStartCol || nCol > nEndCol || nRow < nStartRow || nRow > nEndRow )
+ {
+ if (!pNearData)
+ pNearData = pDB; // ersten angrenzenden Bereich merken
+ }
+ else
+ return pDB; // nicht "unbenannt" und Cursor steht wirklich drin
+ }
+ }
+ if (pNearData)
+ return pNearData; // angrenzender, wenn nichts direkt getroffen
+ return pDoc->GetAnonymousDBData(nTab); // "unbenannt" nur zurueck, wenn sonst nichts gefunden
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/tool/rangeutl.cxx b/sc/source/core/tool/rangeutl.cxx
index 87020e34498b..1df37d84bd18 100644
--- a/sc/source/core/tool/rangeutl.cxx
+++ b/sc/source/core/tool/rangeutl.cxx
@@ -1037,7 +1037,6 @@ sal_Bool ScArea::operator==( const ScArea& r ) const
//------------------------------------------------------------------------
ScAreaNameIterator::ScAreaNameIterator( ScDocument* pDoc ) :
- aStrNoName(ScGlobal::GetRscString(STR_DB_NONAME)),
pRangeName(pDoc->GetRangeName()),
pDBCollection(pDoc->GetDBCollection()),
bFirstPass(true),
@@ -1079,12 +1078,9 @@ sal_Bool ScAreaNameIterator::Next( String& rName, ScRange& rRange )
if ( pDBCollection && nPos < pDBCollection->GetCount() )
{
ScDBData* pData = (*pDBCollection)[nPos++];
- if (pData && pData->GetName() != aStrNoName)
- {
- pData->GetArea( rRange );
- rName = pData->GetName();
- return sal_True; // gefunden
- }
+ pData->GetArea( rRange );
+ rName = pData->GetName();
+ return sal_True; // gefunden
}
else
return false; // gibt nichts mehr
diff --git a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
index 103721d0bbc6..9ff41d8dbb04 100644
--- a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
+++ b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx
@@ -44,6 +44,7 @@
#include "dbcolect.hxx"
#include "document.hxx"
#include "globstr.hrc"
+#include "globalnames.hxx"
#include "XMLExportSharedData.hxx"
#include "rangeutl.hxx"
#include "subtotalparam.hxx"
@@ -98,8 +99,9 @@ ScMyEmptyDatabaseRangesContainer ScXMLExportDatabaseRanges::GetEmptyDatabaseRang
if (xDatabaseRange.is())
{
uno::Reference <beans::XPropertySet> xDatabaseRangePropertySet (xDatabaseRange, uno::UNO_QUERY);
- if (xDatabaseRangePropertySet.is() &&
- ::cppu::any2bool(xDatabaseRangePropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_STRIPDAT)))))
+ bool xDatabaseRangePropertySetis = xDatabaseRangePropertySet.is();
+ bool propVal = ::cppu::any2bool(xDatabaseRangePropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_STRIPDAT))));
+ if (xDatabaseRangePropertySetis && propVal)
{
uno::Sequence <beans::PropertyValue> aImportProperties(xDatabaseRange->getImportDescriptor());
sal_Int32 nLength = aImportProperties.getLength();
@@ -591,17 +593,26 @@ void ScXMLExportDatabaseRanges::WriteDatabaseRanges(const com::sun::star::uno::R
uno::Reference <sheet::XDatabaseRange> xDatabaseRange(xDatabaseRanges->getByName(sDatabaseRangeName), uno::UNO_QUERY);
if (xDatabaseRange.is())
{
- rtl::OUString sOUUnbenannt (ScGlobal::GetRscString(STR_DB_NONAME));
- if (sOUUnbenannt != sDatabaseRangeName)
- rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, sDatabaseRangeName);
+ rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, sDatabaseRangeName);
table::CellRangeAddress aRangeAddress(xDatabaseRange->getDataArea());
rtl::OUString sOUAddress;
ScRangeStringConverter::GetStringFromRange( sOUAddress, aRangeAddress, pDoc, ::formula::FormulaGrammar::CONV_OOO );
rExport.AddAttribute (XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sOUAddress);
ScDBCollection* pDBCollection = pDoc->GetDBCollection();
- sal_uInt16 nIndex;
- pDBCollection->SearchName(sDatabaseRangeName, nIndex);
- ScDBData* pDBData = (*pDBCollection)[nIndex];
+
+ ScDBData* pDBData= NULL;
+ if (sDatabaseRangeName.match(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME))))
+ {
+ rtl::OUString aDBNoName = sDatabaseRangeName.replaceAt(0,rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)).getLength(),rtl::OUString());
+ SCTAB nTab = aDBNoName.toInt32();;
+ pDBData=pDoc->GetAnonymousDBData(nTab);
+ }
+ else
+ {
+ sal_uInt16 nIndex;
+ pDBCollection->SearchName(sDatabaseRangeName, nIndex);
+ pDBData = (*pDBCollection)[nIndex];
+ }
if (pDBData->HasImportSelection())
rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_SELECTION, XML_TRUE);
if (pDBData->HasAutoFilter())
diff --git a/sc/source/filter/xml/xmldrani.cxx b/sc/source/filter/xml/xmldrani.cxx
index 1a791879d0c6..581348904b99 100644
--- a/sc/source/filter/xml/xmldrani.cxx
+++ b/sc/source/filter/xml/xmldrani.cxx
@@ -39,6 +39,7 @@
#include "xmlsorti.hxx"
#include "document.hxx"
#include "globstr.hrc"
+#include "globalnames.hxx"
#include "docuno.hxx"
#include "dbcolect.hxx"
#include "datauno.hxx"
@@ -121,7 +122,7 @@ ScXMLDatabaseRangeContext::ScXMLDatabaseRangeContext( ScXMLImport& rImport,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& xAttrList) :
SvXMLImportContext( rImport, nPrfx, rLName ),
- sDatabaseRangeName(ScGlobal::GetRscString(STR_DB_NONAME)),
+ sDatabaseRangeName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)),
aSortSequence(),
eOrientation(table::TableOrientation_ROWS),
nRefresh(0),
@@ -344,10 +345,31 @@ void ScXMLDatabaseRangeContext::EndElement()
else if (aImportDescriptor[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISNATIVE)))
aImportDescriptor[i].Value <<= bNative;
}
+ ScDBData* pDBData = NULL;
ScDBCollection* pDBCollection = pDoc->GetDBCollection();
- sal_uInt16 nIndex;
- pDBCollection->SearchName(sDatabaseRangeName, nIndex);
- ScDBData* pDBData = (*pDBCollection)[nIndex];
+ rtl::OUString aLocalNoName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
+ rtl::OUString aGlobalNoName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_GLOBAL_NONAME));
+ if (sDatabaseRangeName.match(aLocalNoName)||sDatabaseRangeName==aGlobalNoName)
+ {
+ SCTAB nTab = 0;
+ if (sDatabaseRangeName==aGlobalNoName)//convert old global anonymous db ranges to new sheet local ones
+ {
+ nTab = static_cast<SCTAB> (aCellRangeAddress.Sheet);
+ }
+ else
+ {
+ rtl::OUString aDBNoName(sDatabaseRangeName);
+ aDBNoName = aDBNoName.replaceAt(0,aLocalNoName.getLength(),rtl::OUString());
+ nTab = aDBNoName.toInt32();
+ }
+ pDBData = pDoc->GetAnonymousDBData(nTab);
+ }
+ else
+ {
+ sal_uInt16 nIndex;
+ pDBCollection->SearchName(sDatabaseRangeName, nIndex);
+ pDBData = (*pDBCollection)[nIndex];
+ }
pDBData->SetImportSelection(bIsSelection);
pDBData->SetAutoFilter(bAutoFilter);
if (bAutoFilter)
diff --git a/sc/source/ui/dbgui/dbnamdlg.cxx b/sc/source/ui/dbgui/dbnamdlg.cxx
index fcf29c814933..f1523d07c1e7 100644
--- a/sc/source/ui/dbgui/dbnamdlg.cxx
+++ b/sc/source/ui/dbgui/dbnamdlg.cxx
@@ -43,6 +43,7 @@
#include "globstr.hrc"
#include "dbnamdlg.hrc"
#include "rangenam.hxx" // IsNameValid
+#include "globalnames.hxx"
#define _DBNAMDLG_CXX
#include "dbnamdlg.hxx"
@@ -165,7 +166,7 @@ ScDbNameDlg::ScDbNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
aStrAdd ( ScResId( STR_ADD ) ),
aStrModify ( ScResId( STR_MODIFY ) ),
- aStrNoName ( ScGlobal::GetRscString(STR_DB_NONAME) ),
+ aStrNoName ( RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)),
aStrInvalid ( ScResId( STR_DB_INVALID ) ),
//
pViewData ( ptrViewData ),
@@ -272,7 +273,7 @@ void ScDbNameDlg::Init()
&& (rEnd.Col() == nCol2) && (rEnd.Row() == nRow2 ) )
{
pDBData->GetName( theDbName );
- if ( theDbName != aStrNoName )
+ if (theDbName!=aStrNoName )
aEdName.SetText( theDbName );
else
aEdName.SetText( EMPTY_STRING );
@@ -384,7 +385,7 @@ void ScDbNameDlg::UpdateNames()
if ( pDbData )
{
pDbData->GetName( aString );
- if ( aString != aStrNoName )
+ if (aString!=aStrNoName )
aEdName.InsertEntry( aString );
}
}
diff --git a/sc/source/ui/dbgui/foptmgr.cxx b/sc/source/ui/dbgui/foptmgr.cxx
index d6f9d28b98ea..60b00bf459ee 100644
--- a/sc/source/ui/dbgui/foptmgr.cxx
+++ b/sc/source/ui/dbgui/foptmgr.cxx
@@ -111,6 +111,7 @@ ScFilterOptionsMgr::~ScFilterOptionsMgr()
void ScFilterOptionsMgr::Init()
{
+//moggi:TODO
DBG_ASSERT( pViewData && pDoc, "Init failed :-/" );
rLbCopyPos.SetSelectHdl ( LINK( this, ScFilterOptionsMgr, LbPosSelHdl ) );
@@ -191,7 +192,7 @@ void ScFilterOptionsMgr::Init()
rBtnHeader.Check( pDBData->HasHeader() );
pDBData->GetName( theDbName );
- if ( theDbName != rStrNoName )
+ if ( theDbName!=rStrNoName )
{
rBtnHeader.Disable();
}
diff --git a/sc/source/ui/dbgui/pfiltdlg.cxx b/sc/source/ui/dbgui/pfiltdlg.cxx
index 5cdf37116f13..ab96a0348a74 100644
--- a/sc/source/ui/dbgui/pfiltdlg.cxx
+++ b/sc/source/ui/dbgui/pfiltdlg.cxx
@@ -43,6 +43,7 @@
#include "document.hxx"
#include "uiitems.hxx"
#include "global.hxx"
+#include "globalnames.hxx"
#include "dbcolect.hxx"
#include "scresid.hxx"
@@ -90,7 +91,6 @@ ScPivotFilterDlg::ScPivotFilterDlg( Window* pParent,
aBtnHelp ( this, ScResId( BTN_HELP ) ),
aBtnMore ( this, ScResId( BTN_MORE ) ),
aStrUndefined ( ScResId( SCSTR_UNDEFINED ) ),
- aStrNoName ( ScGlobal::GetRscString(STR_DB_NONAME) ),
aStrNone ( ScResId( SCSTR_NONE ) ),
aStrEmpty ( ScResId( SCSTR_EMPTY ) ),
aStrNotEmpty ( ScResId( SCSTR_NOTEMPTY ) ),
@@ -175,7 +175,7 @@ void ScPivotFilterDlg::Init( const SfxItemSet& rArgSet )
nSrcTab ) );
ScDBCollection* pDBColl = pDoc->GetDBCollection();
String theDbArea;
- String theDbName = aStrNoName;
+ String theDbName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
/*
* Ueberpruefen, ob es sich bei dem uebergebenen
diff --git a/sc/source/ui/dbgui/tpsort.cxx b/sc/source/ui/dbgui/tpsort.cxx
index 6974e7d2135a..5145389cdc0a 100644
--- a/sc/source/ui/dbgui/tpsort.cxx
+++ b/sc/source/ui/dbgui/tpsort.cxx
@@ -43,6 +43,7 @@
#include "viewdata.hxx"
#include "document.hxx"
#include "global.hxx"
+#include "globalnames.hxx"
#include "dbcolect.hxx"
#include "userlist.hxx"
#include "rangeutl.hxx"
@@ -582,7 +583,6 @@ ScTabPageSortOptions::ScTabPageSortOptions( Window* pParent,
aStrRowLabel ( ScResId( STR_ROW_LABEL ) ),
aStrColLabel ( ScResId( STR_COL_LABEL ) ),
aStrUndefined ( ScResId( SCSTR_UNDEFINED ) ),
- aStrNoName ( ScGlobal::GetRscString(STR_DB_NONAME) ),
//
nWhichSort ( rArgSet.GetPool()->GetWhich( SID_SORT ) ),
rSortData ( ((const ScSortItem&)
@@ -648,8 +648,8 @@ void ScTabPageSortOptions::Init()
String theArea;
ScDBCollection* pDBColl = pDoc->GetDBCollection();
String theDbArea;
- String theDbName = aStrNoName;
const SCTAB nCurTab = pViewData->GetTabNo();
+ String theDbName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
aLbOutPos.Clear();
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 7ff1efa3cb78..8991706293a1 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -46,6 +46,7 @@
#include "docsh.hxx"
#include "docfunc.hxx"
#include "globstr.hrc"
+#include "globalnames.hxx"
#include "tabvwsh.hxx"
#include "patattr.hxx"
#include "rangenam.hxx"
@@ -82,10 +83,18 @@ sal_Bool ScDBDocFunc::AddDBRange( const String& rName, const ScRange& rRange, sa
// so CompileDBFormula would never find any name (index) tokens, and would
// unnecessarily loop through all cells.
sal_Bool bCompile = !pDoc->IsImportingXML();
-
+ sal_Bool bOk;
if ( bCompile )
pDoc->CompileDBFormula( sal_True ); // CreateFormulaString
- sal_Bool bOk = pDocColl->Insert( pNew );
+ if (rtl::OUString(rName)==rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)))
+ {
+ pDoc->SetAnonymousDBData(rRange.aStart.Tab() , pNew);
+ bOk = true;
+ }
+ else
+ {
+ bOk = pDocColl->Insert( pNew );
+ }
if ( bCompile )
pDoc->CompileDBFormula( false ); // CompileFormulaString
@@ -200,13 +209,23 @@ sal_Bool ScDBDocFunc::ModifyDBData( const ScDBData& rNewData, sal_Bool /* bApi *
ScDBCollection* pDocColl = pDoc->GetDBCollection();
sal_Bool bUndo (pDoc->IsUndoEnabled());
- sal_uInt16 nPos = 0;
- if (pDocColl->SearchName( rNewData.GetName(), nPos ))
+ ScDBData* pData = NULL;
+ if (rtl::OUString(rNewData.GetName())==rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)))
+ {
+ ScRange aRange;
+ rNewData.GetArea(aRange);
+ SCTAB nTab = aRange.aStart.Tab();
+ pData = pDoc->GetAnonymousDBData(nTab);
+ }
+ else
+ {
+ sal_uInt16 nPos = 0;
+ if (pDocColl->SearchName( rNewData.GetName(), nPos ))
+ pData = (*pDocColl)[nPos];
+ }
+ if (pData)
{
ScDocShellModificator aModificator( rDocShell );
-
- ScDBData* pData = (*pDocColl)[nPos];
-
ScRange aOldRange, aNewRange;
pData->GetArea(aOldRange);
rNewData.GetArea(aNewRange);
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index 4fafac178e2f..88df90702bba 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -50,6 +50,7 @@
#include "docsh.hxx"
#include "global.hxx"
#include "globstr.hrc"
+#include "globalnames.hxx"
#include "undodat.hxx"
#include "undotab.hxx"
#include "undoblk.hxx"
@@ -130,43 +131,6 @@ void ScDocShell::DBAreaDeleted( SCTAB nTab, SCCOL nX1, SCROW nY1, SCCOL nX2, SCR
aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
}
-ScDBData* lcl_GetDBNearCursor( ScDBCollection* pColl, SCCOL nCol, SCROW nRow, SCTAB nTab )
-{
- //! nach document/dbcolect verschieben
-
- if (!pColl)
- return NULL;
-
- ScDBData* pNoNameData = NULL;
- ScDBData* pNearData = NULL;
- sal_uInt16 nCount = pColl->GetCount();
- String aNoName = ScGlobal::GetRscString( STR_DB_NONAME );
- SCTAB nAreaTab;
- SCCOL nStartCol, nEndCol;
- SCROW nStartRow, nEndRow;
- for (sal_uInt16 i = 0; i < nCount; i++)
- {
- ScDBData* pDB = (*pColl)[i];
- pDB->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow );
- if ( nTab == nAreaTab && nCol+1 >= nStartCol && nCol <= nEndCol+1 &&
- nRow+1 >= nStartRow && nRow <= nEndRow+1 )
- {
- if ( pDB->GetName() == aNoName )
- pNoNameData = pDB;
- else if ( nCol < nStartCol || nCol > nEndCol || nRow < nStartRow || nRow > nEndRow )
- {
- if (!pNearData)
- pNearData = pDB; // ersten angrenzenden Bereich merken
- }
- else
- return pDB; // nicht "unbenannt" und Cursor steht wirklich drin
- }
- }
- if (pNearData)
- return pNearData; // angrenzender, wenn nichts direkt getroffen
- return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden
-}
-
ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel )
{
SCCOL nCol = rMarked.aStart.Col();
@@ -179,14 +143,13 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
SCCOL nEndCol = rMarked.aEnd.Col();
SCROW nEndRow = rMarked.aEnd.Row();
SCTAB nEndTab = rMarked.aEnd.Tab();
-
// Nicht einfach GetDBAtCursor: Der zusammenhaengende Datenbereich
// fuer "unbenannt" (GetDataArea) kann neben dem Cursor legen, also muss auch ein
// benannter DB-Bereich dort gesucht werden.
-
+ ScDBCollection* pColl = aDocument.GetDBCollection();
ScDBData* pData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow );
- if (!pData)
- pData = lcl_GetDBNearCursor( aDocument.GetDBCollection(), nCol, nRow, nTab );
+ if (!pData && pColl)
+ pData = pColl->GetDBNearCursor(nCol, nRow, nTab );
sal_Bool bSelected = ( eSel == SC_DBSEL_FORCE_MARK ||
(rMarked.aStart != rMarked.aEnd && eSel != SC_DBSEL_ROW_DOWN) );
@@ -203,7 +166,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
SCCOL nOldCol2;
SCROW nOldRow2;
pData->GetArea( nDummy, nOldCol1,nOldRow1, nOldCol2,nOldRow2 );
- sal_Bool bIsNoName = ( pData->GetName() == ScGlobal::GetRscString( STR_DB_NONAME ) );
+ sal_Bool bIsNoName = ( rtl::OUString(pData->GetName()) == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)) );
if (!bSelected)
{
@@ -282,13 +245,9 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol,nStartRow, nEndCol,nEndRow, nTab );
- ScDBData* pNoNameData;
- sal_uInt16 nNoNameIndex;
- ScDBCollection* pColl = aDocument.GetDBCollection();
- if ( eMode != SC_DB_IMPORT &&
- pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) )
+ ScDBData* pNoNameData = aDocument.GetAnonymousDBData(nTab);
+ if ( eMode != SC_DB_IMPORT && pNoNameData)
{
- pNoNameData = (*pColl)[nNoNameIndex];
if ( !pOldAutoDBRange )
{
@@ -334,13 +293,21 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
aNewName += String::CreateFromInt32( nCount );
}
while (pColl->SearchName( aNewName, nDummy ));
+ pNoNameData = new ScDBData( aNewName, nTab,
+ nStartCol,nStartRow, nEndCol,nEndRow,
+ sal_True, bHasHeader );
+ pColl->Insert( pNoNameData );
}
else
- aNewName = ScGlobal::GetRscString( STR_DB_NONAME );
- pNoNameData = new ScDBData( aNewName, nTab,
+ {
+ aNewName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
+ pNoNameData = new ScDBData(aNewName , nTab,
nStartCol,nStartRow, nEndCol,nEndRow,
sal_True, bHasHeader );
- pColl->Insert( pNoNameData );
+ aDocument.SetAnonymousDBData(nTab, pNoNameData);
+ }
+
+
if ( pUndoColl )
{
@@ -372,23 +339,22 @@ ScDBData* ScDocShell::GetOldAutoDBRange()
void ScDocShell::CancelAutoDBRange()
{
// called when dialog is cancelled
+//moggi:TODO
if ( pOldAutoDBRange )
{
- sal_uInt16 nNoNameIndex;
- ScDBCollection* pColl = aDocument.GetDBCollection();
- if ( pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) )
+ SCTAB nTab = GetCurTab();
+ ScDBData* pDBData = aDocument.GetAnonymousDBData(nTab);
+ if ( pDBData )
{
- ScDBData* pNoNameData = (*pColl)[nNoNameIndex];
-
SCCOL nRangeX1;
SCROW nRangeY1;
SCCOL nRangeX2;
SCROW nRangeY2;
SCTAB nRangeTab;
- pNoNameData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
+ pDBData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
DBAreaDeleted( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
- *pNoNameData = *pOldAutoDBRange; // restore old settings
+ *pDBData = *pOldAutoDBRange; // restore old settings
if ( pOldAutoDBRange->HasAutoFilter() )
{
@@ -507,8 +473,7 @@ String lcl_GetAreaName( ScDocument* pDoc, ScArea* pArea )
if (pData)
{
pData->GetName( aName );
- if ( aName != ScGlobal::GetRscString( STR_DB_NONAME ) )
- bOk = sal_True;
+ bOk = sal_True;
}
if (!bOk)
diff --git a/sc/source/ui/inc/pfiltdlg.hxx b/sc/source/ui/inc/pfiltdlg.hxx
index bb68e07b3891..0c35cc916a13 100644
--- a/sc/source/ui/inc/pfiltdlg.hxx
+++ b/sc/source/ui/inc/pfiltdlg.hxx
@@ -90,7 +90,6 @@ private:
HelpButton aBtnHelp;
MoreButton aBtnMore;
const String aStrUndefined;
- const String aStrNoName;
const String aStrNone;
const String aStrEmpty;
const String aStrNotEmpty;
diff --git a/sc/source/ui/inc/tpsort.hxx b/sc/source/ui/inc/tpsort.hxx
index 8f22696c879d..fefd0575f3d2 100644
--- a/sc/source/ui/inc/tpsort.hxx
+++ b/sc/source/ui/inc/tpsort.hxx
@@ -188,7 +188,6 @@ private:
LocalizedString aStrRowLabel;
LocalizedString aStrColLabel;
LocalizedString aStrUndefined;
- String aStrNoName;
String aStrAreaLabel;
const sal_uInt16 nWhichSort;
diff --git a/sc/source/ui/inc/undobase.hxx b/sc/source/ui/inc/undobase.hxx
index abc6770157e0..701378430d2d 100644
--- a/sc/source/ui/inc/undobase.hxx
+++ b/sc/source/ui/inc/undobase.hxx
@@ -101,6 +101,7 @@ protected:
class ScDBFuncUndo: public ScSimpleUndo
{
+protected:
ScDBData* pAutoDBRange;
ScRange aOriginalRange;
SdrUndoAction* mpDrawUndo;
diff --git a/sc/source/ui/navipi/content.cxx b/sc/source/ui/navipi/content.cxx
index 90d83f861008..ad957181e12f 100644
--- a/sc/source/ui/navipi/content.cxx
+++ b/sc/source/ui/navipi/content.cxx
@@ -708,13 +708,11 @@ void ScContentTree::GetDbNames()
sal_uInt16 nCount = pDbNames->GetCount();
if ( nCount > 0 )
{
- String aStrNoName( ScGlobal::GetRscString(STR_DB_NONAME) );
for ( sal_uInt16 i=0; i<nCount; i++ )
{
ScDBData* pData = (*pDbNames)[i];
String aStrName = pData->GetName();
- if ( aStrName != aStrNoName )
- InsertContent( SC_CONTENT_DBAREA, aStrName );
+ InsertContent( SC_CONTENT_DBAREA, aStrName );
}
}
}
diff --git a/sc/source/ui/undo/undobase.cxx b/sc/source/ui/undo/undobase.cxx
index f7da441529bc..20d38fc9a89a 100644
--- a/sc/source/ui/undo/undobase.cxx
+++ b/sc/source/ui/undo/undobase.cxx
@@ -371,13 +371,11 @@ void ScDBFuncUndo::EndUndo()
if ( pAutoDBRange )
{
- sal_uInt16 nNoNameIndex;
ScDocument* pDoc = pDocShell->GetDocument();
- ScDBCollection* pColl = pDoc->GetDBCollection();
- if ( pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) )
+ SCTAB nTab = pDoc->GetVisibleTab();
+ ScDBData* pNoNameData = pDoc->GetAnonymousDBData(nTab);
+ if (pNoNameData )
{
- ScDBData* pNoNameData = (*pColl)[nNoNameIndex];
-
SCCOL nRangeX1;
SCROW nRangeY1;
SCCOL nRangeX2;
@@ -406,12 +404,10 @@ void ScDBFuncUndo::BeginRedo()
{
// move the database range to this function's position again (see ScDocShell::GetDBData)
- sal_uInt16 nNoNameIndex;
ScDocument* pDoc = pDocShell->GetDocument();
- ScDBCollection* pColl = pDoc->GetDBCollection();
- if ( pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) )
+ ScDBData* pNoNameData = pDoc->GetAnonymousDBData(aOriginalRange.aStart.Tab());
+ if ( pNoNameData )
{
- ScDBData* pNoNameData = (*pColl)[nNoNameIndex];
SCCOL nRangeX1;
SCROW nRangeY1;
diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx
index dc23ff8f6aeb..b1c3bc5693ef 100644
--- a/sc/source/ui/undo/undodat.cxx
+++ b/sc/source/ui/undo/undodat.cxx
@@ -45,6 +45,7 @@
#include "pivot.hxx"
#include "globstr.hrc"
#include "global.hxx"
+#include "globalnames.hxx"
#include "target.hxx"
#include "chartarr.hxx"
#include "dbdocfun.hxx"
@@ -1111,10 +1112,22 @@ void ScUndoAutoFilter::DoChange( sal_Bool bUndo )
sal_uInt16 nIndex;
ScDocument* pDoc = pDocShell->GetDocument();
- ScDBCollection* pColl = pDoc->GetDBCollection();
- if ( pColl->SearchName( aDBName, nIndex ) )
+ ScDBData* pDBData=NULL;
+ if (rtl::OUString(aDBName) == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)))
+ {
+ SCTAB nTab = aOriginalRange.aStart.Tab();
+ pDBData = pDoc->GetAnonymousDBData(nTab);
+ }
+ else
+ {
+ ScDBCollection* pColl = pDoc->GetDBCollection();
+ if (pColl->SearchName( aDBName, nIndex ))
+ pDBData = (*pColl)[nIndex];
+ }
+
+
+ if ( pDBData )
{
- ScDBData* pDBData = (*pColl)[nIndex];
pDBData->SetAutoFilter( bNewFilter );
SCCOL nRangeX1;
diff --git a/sc/source/ui/undo/undoutil.cxx b/sc/source/ui/undo/undoutil.cxx
index 9668e5b0d4ac..f022e0492ce6 100644
--- a/sc/source/ui/undo/undoutil.cxx
+++ b/sc/source/ui/undo/undoutil.cxx
@@ -42,6 +42,7 @@
#include "document.hxx"
#include "dbcolect.hxx"
#include "globstr.hrc"
+#include "globalnames.hxx"
#include "global.hxx"
void ScUndoUtil::MarkSimpleBlock( ScDocShell* pDocShell,
@@ -98,22 +99,18 @@ ScDBData* ScUndoUtil::GetOldDBData( ScDBData* pUndoData, ScDocument* pDoc, SCTAB
{
String aName;
pUndoData->GetName( aName );
- if ( aName == ScGlobal::GetRscString( STR_DB_NONAME ) )
+ if ( rtl::OUString(aName) == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME) ) )
bWasTemp = sal_True;
}
DBG_ASSERT(bWasTemp, "Undo: didn't find database range");
(void)bWasTemp;
-
- sal_uInt16 nIndex;
- ScDBCollection* pColl = pDoc->GetDBCollection();
- if (pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nIndex ))
- pRet = (*pColl)[nIndex];
- else
+ pRet = pDoc->GetAnonymousDBData(nTab);
+ if (!pRet)
{
- pRet = new ScDBData( ScGlobal::GetRscString( STR_DB_NONAME ), nTab,
+ pRet = new ScDBData( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)), nTab,
nCol1,nRow1, nCol2,nRow2, sal_True,
pDoc->HasColHeader( nCol1,nRow1,nCol2,nRow2,nTab ) );
- pColl->Insert( pRet );
+ pDoc->SetAnonymousDBData(nTab,pRet);
}
}
diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 7c8ef5b8fcd4..b44b1c760c4f 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -1636,6 +1636,15 @@ ScDBData* ScDatabaseRangeObj::GetDBData_Impl() const
ScDBData* pRet = NULL;
if (pDocShell)
{
+ ScDocument* pDoc = pDocShell->GetDocument();
+ if (rtl::OUString(aName).match(ScGlobal::GetRscString(STR_DB_NONAME)))
+ {
+ rtl::OUString aDBNoName(aName);
+ aDBNoName = aDBNoName.replaceAt(0,rtl::OUString(ScGlobal::GetRscString(STR_DB_NONAME)).getLength(),rtl::OUString());
+ SCTAB nTab = aDBNoName.toInt32();
+ if (pDoc->GetAnonymousDBData(nTab))
+ return pDoc->GetAnonymousDBData(nTab);
+ }
ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
if (pNames)
{
@@ -2184,9 +2193,29 @@ ScDatabaseRangeObj* ScDatabaseRangesObj::GetObjectByIndex_Impl(sal_uInt16 nIndex
{
if (pDocShell)
{
- ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
+ ScDocument* pDoc = pDocShell->GetDocument();
+ ScDBCollection* pNames = pDoc->GetDBCollection();
if (pNames && nIndex < pNames->GetCount())
return new ScDatabaseRangeObj( pDocShell, (*pNames)[nIndex]->GetName() );
+ else
+ {
+ sal_uInt16 nCount = 0;
+ if (pNames)
+ nCount = pNames->GetCount();
+ for (SCTAB nTab = 0; nTab < pDoc->GetTableCount(); ++nTab)
+ {
+ if (pDoc->GetAnonymousDBData(nTab))
+ {
+ if (nIndex==nCount)
+ {
+ rtl::OUStringBuffer aBuffer(ScGlobal::GetRscString( STR_DB_NONAME ));
+ aBuffer.append(nTab);
+ return new ScDatabaseRangeObj( pDocShell, aBuffer.makeStringAndClear());
+ }
+ ++nCount;
+ }
+ }
+ }
}
return NULL;
}
@@ -2210,12 +2239,28 @@ void SAL_CALL ScDatabaseRangesObj::addNewByName( const rtl::OUString& aName,
sal_Bool bDone = false;
if (pDocShell)
{
- ScDBDocFunc aFunc(*pDocShell);
-
- String aString(aName);
- ScRange aNameRange( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
- (SCCOL)aRange.EndColumn, (SCROW)aRange.EndRow, aRange.Sheet );
- bDone = aFunc.AddDBRange( aString, aNameRange, sal_True );
+ //moggi
+ if (aName.match(ScGlobal::GetRscString( STR_DB_NONAME )))
+ {
+ rtl::OUString aDBNoName(aName);
+ aDBNoName = aDBNoName.replaceAt(0,rtl::OUString(ScGlobal::GetRscString(STR_DB_NONAME)).getLength(),rtl::OUString());
+ SCTAB nTab = aDBNoName.toInt32();
+ String aNewName = ScGlobal::GetRscString( STR_DB_NONAME );
+ ScDBData* pNoNameData = new ScDBData(aNewName , nTab,
+ (SCCOL)aRange.StartColumn,(SCROW)aRange.StartRow,
+ (SCCOL)aRange.EndColumn,(SCROW)aRange.EndRow,
+ sal_True, true );//moggi
+ pDocShell->GetDocument()->SetAnonymousDBData(nTab,pNoNameData);
+ bDone = true;
+ }
+ else
+ {
+ ScDBDocFunc aFunc(*pDocShell);
+ String aString(aName);
+ ScRange aNameRange( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
+ (SCCOL)aRange.EndColumn, (SCROW)aRange.EndRow, aRange.Sheet );
+ bDone = aFunc.AddDBRange( aString, aNameRange, sal_True );
+ }
}
if (!bDone)
throw uno::RuntimeException(); // no other exceptions specified
@@ -2255,9 +2300,17 @@ sal_Int32 SAL_CALL ScDatabaseRangesObj::getCount() throw(uno::RuntimeException)
if (pDocShell)
{
- ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
+ sal_Int32 nCountAnonymousDBData;
+ ScDocument* pDoc = pDocShell->GetDocument();
+ for (SCTAB nTab=0; nTab<pDoc->GetTableCount();nTab++)
+ {
+ if (pDoc->GetAnonymousDBData(nTab))
+ ++nCountAnonymousDBData;
+ }
+ ScDBCollection* pNames = pDoc->GetDBCollection();
if (pNames)
- return pNames->GetCount();
+ return pNames->GetCount() + nCountAnonymousDBData ;
+ return nCountAnonymousDBData;
}
return 0;
}
@@ -2310,16 +2363,36 @@ uno::Sequence<rtl::OUString> SAL_CALL ScDatabaseRangesObj::getElementNames()
if (pDocShell)
{
- ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
+ ScDocument* pDoc = pDocShell->GetDocument();
+ sal_uInt16 nCountAnonymousDBData=0;
+ for (SCTAB nTab=0; nTab<pDoc->GetTableCount();nTab++)
+ {
+ if (pDoc->GetAnonymousDBData(nTab))
+ nCountAnonymousDBData++;
+ }
+ ScDBCollection* pNames = pDoc->GetDBCollection();
+ sal_uInt16 nCountDBData = 0;
if (pNames)
{
- sal_uInt16 nCount = pNames->GetCount();
+ nCountDBData = pNames->GetCount();
String aName;
- uno::Sequence<rtl::OUString> aSeq(nCount);
+ uno::Sequence<rtl::OUString> aSeq(nCountDBData + nCountAnonymousDBData);
rtl::OUString* pAry = aSeq.getArray();
- for (sal_uInt16 i=0; i<nCount; i++)
+ for (sal_uInt16 i=0; i<nCountDBData; i++)
+ {
pAry[i] = (*pNames)[i]->GetName();
-
+ }
+ for (SCTAB nTab=0;nTab<pDoc->GetTableCount();nTab++)
+ {
+ sal_uInt16 i =0;
+ if (pDoc->GetAnonymousDBData(nTab))
+ {
+ rtl::OUStringBuffer aStrBuffer(ScGlobal::GetRscString( STR_DB_NONAME ));
+ aStrBuffer.append(nTab);
+ pAry[nCountDBData+i]=aStrBuffer.makeStringAndClear();
+ i++;
+ }
+ }
return aSeq;
}
}
@@ -2335,7 +2408,18 @@ sal_Bool SAL_CALL ScDatabaseRangesObj::hasByName( const rtl::OUString& aName )
if (pDocShell)
{
- ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection();
+ ScDocument* pDoc = pDocShell->GetDocument();
+ if (aName.match(ScGlobal::GetRscString(STR_DB_NONAME)))
+ {
+ rtl::OUString aDBNoName(aName);
+ aDBNoName = aDBNoName.replaceAt(0,rtl::OUString(ScGlobal::GetRscString(STR_DB_NONAME)).getLength(),rtl::OUString());
+ SCTAB nTab = aDBNoName.toInt32();
+ if (pDoc->GetAnonymousDBData(nTab))
+ return sal_True;
+ else
+ return sal_False;
+ }
+ ScDBCollection* pNames = pDoc->GetDBCollection();
if (pNames)
{
String aString(aName);
diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx
index 8091d579ac6c..f7d8431b7fbb 100644
--- a/sc/source/ui/view/cellsh2.cxx
+++ b/sc/source/ui/view/cellsh2.cxx
@@ -56,6 +56,7 @@
#include "sc.hrc"
#include "globstr.hrc"
#include "global.hxx"
+#include "globalnames.hxx"
#include "scmod.hxx"
#include "docsh.hxx"
#include "document.hxx"
@@ -722,7 +723,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
if ( pDBCol )
{
- const String aStrNoName( ScGlobal::GetRscString(STR_DB_NONAME) );
+ const String aStrNoName( RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME) );
List aList;
sal_uInt16 nDBCount = pDBCol->GetCount();
ScDBData* pDbData = NULL;
@@ -736,7 +737,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
pDBName = new String;
pDbData->GetName( *pDBName );
- if ( *pDBName != aStrNoName )
+ if ( *pDBName!=aStrNoName )
aList.Insert( pDBName );
else
DELETEZ(pDBName);