diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2011-03-24 23:14:28 -0400 |
---|---|---|
committer | Kohei Yoshida <kyoshida@novell.com> | 2011-04-01 00:11:02 -0400 |
commit | 7df4c7feacf51c141a7beaa2a8404d932d7c2e86 (patch) | |
tree | 382fc1f4af02a368cc905f9e7dd341e152f9965c /sc | |
parent | d8e16e5559b715b8c2853f262a0636e79f5c1853 (diff) |
Support sheet-local anonymous database ranges.
This is for an Easy Hack to allow one autofilter per sheet, not per
document.
Diffstat (limited to 'sc')
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); |