diff options
27 files changed, 475 insertions, 215 deletions
diff --git a/sc/inc/dbcolect.hxx b/sc/inc/dbcolect.hxx index 859b85839..1b40d9e20 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 bec764d21..ba341a303 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 000000000..6fb983a6c --- /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 98490f545..9db1155e8 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 75a2e59a0..d99cd1868 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 e8f9a8c59..bb881a0c6 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 b36f5e7c6..c49f28693 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 7d6a41e23..b59270d5f 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 95beb3708..9294e5817 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 dbb074f70..72bd8d644 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 4d9ef1616..e09c7f1cd 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 9bf45a5b9..aff95e57c 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 381d658ad..94bbc92ee 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 ba56e441d..cb1bbb9ac 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 799fa0476..9f59d426f 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 364bdbf52..2450abbe4 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 c325c5957..21733201a 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 c1edfa8fb..2e6410957 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 df2f2454d..c6dc56414 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 bc67272e8..a6fca08ff 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 6924284f8..1196eee94 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 8dcbd2a4a..8fc3dca97 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 5196359db..cac407515 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 bdb6363bf..8b8f56d18 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 0e22e2532..93d9c3fe8 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 b1c4b4cfc..15d186a5f 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 9a2b5205e..a85c15e35 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); |