[Libreoffice-commits] core.git: Branch 'aoo/trunk' - sc/inc sc/source
Oliver-Rainer Wittmann
orw at apache.org
Fri Sep 6 09:10:10 PDT 2013
sc/inc/dbcolect.hxx | 14 -
sc/inc/document.hxx | 8
sc/inc/global.hxx | 11 -
sc/inc/rangeutl.hxx | 1
sc/source/core/data/documen3.cxx | 15 -
sc/source/core/tool/dbcolect.cxx | 96 ++------
sc/source/core/tool/rangeutl.cxx | 8
sc/source/ui/dbgui/dbnamdlg.cxx | 17 -
sc/source/ui/dbgui/foptmgr.cxx | 8
sc/source/ui/docshell/dbdocfun.cxx | 4
sc/source/ui/docshell/docsh5.cxx | 404 ++++++++++++-------------------------
sc/source/ui/inc/dbfunc.hxx | 1
sc/source/ui/inc/docsh.hxx | 2
sc/source/ui/navipi/content.cxx | 7
sc/source/ui/undo/undoutil.cxx | 33 ++-
sc/source/ui/view/cellsh2.cxx | 19 -
sc/source/ui/view/dbfunc.cxx | 175 ++++++++--------
sc/source/ui/view/tabvwshc.cxx | 4
18 files changed, 342 insertions(+), 485 deletions(-)
New commits:
commit 2e1614441cf56ed174572e2b92a451055ad626bd
Author: Oliver-Rainer Wittmann <orw at apache.org>
Date: Fri Sep 6 15:26:36 2013 +0000
122862: adjust code for issue 12666 in order to solve regressions 122862, 122870, 122955, 123161 and 123163
For 12666 new internal database ranges have been introduced. The fix reduced its usage to the once needed
for the Auto Filter function. Standard Filter and Special Filter should be untouched now.
diff --git a/sc/inc/dbcolect.hxx b/sc/inc/dbcolect.hxx
index 3c436d9..ca24435 100644
--- a/sc/inc/dbcolect.hxx
+++ b/sc/inc/dbcolect.hxx
@@ -136,8 +136,10 @@ public:
void GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2) const;
SC_DLLPUBLIC void GetArea(ScRange& rRange) const;
void SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
- //If the name of DBData is started with "unnamed", it will be recognized as build in DBData
- sal_Bool IsBuildin();
+
+ bool IsInternalUnnamed() const;
+ bool IsInternalForAutoFilter() const;
+
void MoveTo(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
sal_Bool IsByRow() const { return bByRow; }
void SetByRow(sal_Bool bByR) { bByRow = bByR; }
@@ -216,9 +218,13 @@ public:
virtual short Compare(ScDataObject* pKey1, ScDataObject* pKey2) const;
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* GetDBAtArea(
+ const SCTAB nTab,
+ const SCCOL nCol1,
+ const SCROW nRow1,
+ const SCCOL nCol2,
+ const SCROW nRow2 ) const;
ScDBData* GetFilterDBAtTable(SCTAB nTab) const;
- ScDBData* GetDBAtTable(SCTAB nTab, ScGetDBMode eMode) const;
sal_Bool SearchName( const String& rName, sal_uInt16& rIndex ) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 025c322..be2a417 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -505,10 +505,7 @@ public:
sal_Bool bStartOnly = sal_False) const;
ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const;
ScDBData* GetFilterDBAtTable(SCTAB nTab) const;
-//UNUSED2008-05 ScRangeData* GetRangeAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab,
-//UNUSED2008-05 sal_Bool bStartOnly = sal_False) const;
SC_DLLPUBLIC ScRangeData* GetRangeAtBlock( const ScRange& rBlock, String* pName=NULL ) const;
- ScDBData* GetDBAtTable(SCTAB nTab, ScGetDBMode eMode) const;
SC_DLLPUBLIC ScDPCollection* GetDPCollection();
ScDPObject* GetDPAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab) const;
@@ -1514,7 +1511,10 @@ public:
TypedScStrCollection& rStrings, sal_Bool bLimit = sal_False );
sal_Bool GetFormulaEntries( TypedScStrCollection& rStrings );
- sal_Bool HasAutoFilter( SCCOL nCol, SCROW nRow, SCTAB nTab );
+ sal_Bool HasAutoFilter(
+ const SCCOL nCol,
+ const SCROW nRow,
+ const SCTAB nTab );
SC_DLLPUBLIC sal_Bool HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
SCTAB nTab );
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index d2206aa..2c5d834 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -404,13 +404,10 @@ enum ScAnchorType // Verankerung eines Zeichenobjekts
enum ScGetDBMode
{
- SC_DB_MAKE, // wenn noetig, "unbenannt" anlegen
- SC_DB_IMPORT, // wenn noetig, "Importx" anlegen
- SC_DB_OLD, // nicht neu anlegen
- SC_DB_MAKE_FILTER, // to create a new filter/sort/subtotal
- SC_DB_MAKE_SORT,
- SC_DB_MAKE_SUBTOTAL,
- SC_DB_OLD_FILTER //to find a existed filter
+ SC_DB_MAKE, // if needed create database range with name $STR_DB_NONAME
+ SC_DB_IMPORT, // if needed create database range with name $STR_DBNAME_IMPORT[X]
+ SC_DB_OLD, // do not create new database range, provide only existing one
+ SC_DB_MAKE_AUTOFILTER // if needed create database range with name $SC_DBNAME_UNNAMED[X]
};
/// For ScDBFunc::GetDBData()
diff --git a/sc/inc/rangeutl.hxx b/sc/inc/rangeutl.hxx
index c2226ac..08915b3 100644
--- a/sc/inc/rangeutl.hxx
+++ b/sc/inc/rangeutl.hxx
@@ -302,7 +302,6 @@ private:
ScDBCollection* pDBCollection;
sal_Bool bFirstPass;
sal_uInt16 nPos;
- String aStrNoName;
public:
ScAreaNameIterator( ScDocument* pDoc );
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 1795f9b..df4183e 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -192,13 +192,6 @@ ScDBData* ScDocument::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nC
else
return NULL;
}
-ScDBData* ScDocument::GetDBAtTable(SCTAB nTab, ScGetDBMode eMode) const
-{
- if (pDBCollection)
- return pDBCollection->GetDBAtTable(nTab, eMode);
- else
- return NULL;
-}
ScDBData* ScDocument::GetFilterDBAtTable(SCTAB nTab) const
{
@@ -1296,10 +1289,12 @@ sal_Bool ScDocument::CreateQueryParam(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCR
return sal_False;
}
-sal_Bool ScDocument::HasAutoFilter( SCCOL /*nCurCol*/, SCROW /*nCurRow*/, SCTAB nCurTab )
+sal_Bool ScDocument::HasAutoFilter(
+ const SCCOL nCurCol,
+ const SCROW nCurRow,
+ const SCTAB nCurTab )
{
- //ScDBData* pDBData = GetDBAtCursor( nCurCol, nCurRow, nCurTab );
- ScDBData* pDBData = GetDBAtTable(nCurTab, SC_DB_OLD_FILTER);
+ ScDBData* pDBData = GetDBAtCursor( nCurCol, nCurRow, nCurTab );
sal_Bool bHasAutoFilter = ( pDBData != NULL );
if ( pDBData )
diff --git a/sc/source/core/tool/dbcolect.cxx b/sc/source/core/tool/dbcolect.cxx
index bc1c1db..e5e3334 100644
--- a/sc/source/core/tool/dbcolect.cxx
+++ b/sc/source/core/tool/dbcolect.cxx
@@ -691,11 +691,18 @@ ScDataObject* ScDBData::Clone() const
{
return new ScDBData(*this);
}
-sal_Bool ScDBData::IsBuildin()
+
+
+bool ScDBData::IsInternalUnnamed() const
{
- String aNoName = String::CreateFromAscii(SC_DBNAME_UNNAMED);
- String aBeginName = aName.Copy(0,22);
- return (sal_Bool)(!ScGlobal::GetpTransliteration()->compareString( aNoName, aBeginName ));
+ return GetName() == ScGlobal::GetRscString( STR_DB_NONAME );
+}
+
+bool ScDBData::IsInternalForAutoFilter() const
+{
+ const String aNoName = String::CreateFromAscii(SC_DBNAME_UNNAMED);
+ const String aBeginName = aName.Copy( 0, aNoName.Len() );
+ return aBeginName == aNoName;
}
//---------------------------------------------------------------------------------------
@@ -717,7 +724,7 @@ 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* pInternalDBData = NULL;
if (pItems)
{
@@ -725,32 +732,42 @@ ScDBData* ScDBCollection::GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_
if (((ScDBData*)pItems[i])->IsDBAtCursor(nCol, nRow, nTab, bStartOnly))
{
ScDBData* pDB = (ScDBData*)pItems[i];
- if ( pDB->IsBuildin() )
- pNoNameData = pDB;
+ if ( pDB->IsInternalUnnamed()
+ || pDB->IsInternalForAutoFilter() )
+ {
+ pInternalDBData = pDB;
+ }
else
+ {
return pDB;
+ }
}
}
- return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden
+ return pInternalDBData;
}
-ScDBData* ScDBCollection::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
+ScDBData* ScDBCollection::GetDBAtArea(
+ const SCTAB nTab,
+ const SCCOL nCol1,
+ const SCROW nRow1,
+ const SCCOL nCol2,
+ const SCROW nRow2 ) const
{
- ScDBData* pNoNameData = NULL;
+ ScDBData* pInternalDBData = NULL;
if (pItems)
{
-
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->IsBuildin() )
- pNoNameData = pDB;
+ if ( pDB->IsInternalUnnamed()
+ || pDB->IsInternalForAutoFilter() )
+ pInternalDBData = pDB;
else
return pDB;
}
}
- return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden
+ return pInternalDBData;
}
ScDBData* ScDBCollection::GetFilterDBAtTable(SCTAB nTab) const
@@ -920,54 +937,3 @@ String ScDBCollection::GetNewDefaultDBName()
}while(SearchName(aNewName,nDummy));
return aNewName;
}
-/*
-sal_Bool ScDBCollection::IsFiltered(SCTAB nTab, SCROW nRow)
-{
- SCCOL nLastCol;
- SCROW nLastRow;
- pDoc->GetLastAttrCellArea(nTab, nLastCol, nLastRow);
-
- if ( pItems )
- {
- for (unsigned short i = 0; i < nCount; i++)
- {
- ScDBData* pData = (ScDBData*)pItems[i];
- if ( pData->nTable == nTab && pData->HasQueryParam() && pData->bQueryInplace )
- if ( nRow >= (pData->nStartRow + (pData->HasHeader()?1:0)) && nRow <= pData->nEndRow && nRow <= nLastRow )
- return sal_True;
- }
- }
- return sal_False;
-}
-*/
-ScDBData* ScDBCollection::GetDBAtTable(SCTAB nTab, ScGetDBMode eMode) const
-{
- ScDBData* pDataEmpty = NULL;
- if (pItems)
- {
- for (unsigned short i = 0; i < nCount; i++)
- {
- ScDBData* pDBTemp = (ScDBData*)pItems[i];
- if ( pDBTemp->nTable == nTab ) //Sym2_7885 mod
- {
- sal_Bool bImport = pDBTemp->HasImportParam();
- sal_Bool bFilter = pDBTemp->HasAutoFilter() || pDBTemp->HasQueryParam();
- sal_Bool bSort = pDBTemp->HasSortParam();
- sal_Bool bSubtotal = pDBTemp->HasSubTotalParam();
- sal_Bool bAnyParam = bImport || bFilter || bSort || bSubtotal;
- if ( ((eMode == SC_DB_MAKE_SORT) && bSort && !bFilter) || //Sym2_7334 mod 20100420
- ((eMode == SC_DB_MAKE_SUBTOTAL) && bSubtotal && !bFilter ) ||
- ((eMode == SC_DB_MAKE_FILTER || eMode == SC_DB_OLD_FILTER) && bFilter ) )
- {
- return pDBTemp;
- }
- else if ( pDBTemp->IsBuildin() && !bAnyParam ) //Sym2_7885 mod
- {
- pDataEmpty = pDBTemp;
- }
- }
- }
- }
-
- return pDataEmpty;
-}
diff --git a/sc/source/core/tool/rangeutl.cxx b/sc/source/core/tool/rangeutl.cxx
index ae36c67..2fb3271 100644
--- a/sc/source/core/tool/rangeutl.cxx
+++ b/sc/source/core/tool/rangeutl.cxx
@@ -997,8 +997,7 @@ sal_Bool ScArea::operator==( const ScArea& r ) const
//------------------------------------------------------------------------
-ScAreaNameIterator::ScAreaNameIterator( ScDocument* pDoc ) :
- aStrNoName( ScGlobal::GetRscString(STR_DB_NONAME) )
+ScAreaNameIterator::ScAreaNameIterator( ScDocument* pDoc )
{
pRangeName = pDoc->GetRangeName();
pDBCollection = pDoc->GetDBCollection();
@@ -1032,8 +1031,9 @@ sal_Bool ScAreaNameIterator::Next( String& rName, ScRange& rRange )
if ( pDBCollection && nPos < pDBCollection->GetCount() )
{
ScDBData* pData = (*pDBCollection)[nPos++];
-// if (pData && pData->GetName() != aStrNoName)
- if (pData && !pData->IsBuildin())
+ if ( pData
+ && !pData->IsInternalUnnamed()
+ && !pData->IsInternalForAutoFilter() )
{
pData->GetArea( rRange );
rName = pData->GetName();
diff --git a/sc/source/ui/dbgui/dbnamdlg.cxx b/sc/source/ui/dbgui/dbnamdlg.cxx
index cc843cc..7652853 100644
--- a/sc/source/ui/dbgui/dbnamdlg.cxx
+++ b/sc/source/ui/dbgui/dbnamdlg.cxx
@@ -160,7 +160,6 @@ ScDbNameDlg::ScDbNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
aStrAdd ( ScResId( STR_ADD ) ),
aStrModify ( ScResId( STR_MODIFY ) ),
- aStrNoName ( ScGlobal::GetRscString(STR_DB_NONAME) ),
aStrInvalid ( ScResId( STR_DB_INVALID ) ),
//
pViewData ( ptrViewData ),
@@ -237,10 +236,10 @@ void ScDbNameDlg::Init()
ScDBData* pDBData = NULL;
pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
- nEndCol, nEndRow, nEndTab );
+ nEndCol, nEndRow, nEndTab );
theCurArea = ScRange( ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( nEndCol, nEndRow, nEndTab ) );
+ ScAddress( nEndCol, nEndRow, nEndTab ) );
theCurArea.Format( theAreaStr, ABS_DREF3D, pDoc, aAddrDetails );
@@ -266,11 +265,15 @@ void ScDbNameDlg::Init()
&& (rEnd.Col() == nCol2) && (rEnd.Row() == nRow2 ) )
{
pDBData->GetName( theDbName );
- //if ( theDbName != aStrNoName )
- if ( !pDBData->IsBuildin() )
+ if ( !pDBData->IsInternalUnnamed()
+ && !pDBData->IsInternalForAutoFilter() )
+ {
aEdName.SetText( theDbName );
+ }
else
+ {
aEdName.SetText( EMPTY_STRING );
+ }
aBtnHeader.Check( pDBData->HasHeader() );
aBtnDoSize.Check( pDBData->IsDoSize() );
aBtnKeepFmt.Check( pDBData->IsKeepFmt() );
@@ -379,8 +382,8 @@ void ScDbNameDlg::UpdateNames()
if ( pDbData )
{
pDbData->GetName( aString );
- //if ( aString != aStrNoName )
- if ( !pDbData->IsBuildin() )
+ if ( !pDbData->IsInternalUnnamed()
+ && !pDbData->IsInternalForAutoFilter() )
aEdName.InsertEntry( aString );
}
}
diff --git a/sc/source/ui/dbgui/foptmgr.cxx b/sc/source/ui/dbgui/foptmgr.cxx
index 0e7c546..fef0f5d 100644
--- a/sc/source/ui/dbgui/foptmgr.cxx
+++ b/sc/source/ui/dbgui/foptmgr.cxx
@@ -178,15 +178,15 @@ void ScFilterOptionsMgr::Init()
{
ScAddress& rStart = theCurArea.aStart;
ScAddress& rEnd = theCurArea.aEnd;
- ScDBData* pDBData = pDBColl->GetDBAtArea( rStart.Tab(),
- rStart.Col(), rStart.Row(),
- rEnd.Col(), rEnd.Row() );
+ ScDBData* pDBData = pDBColl->GetDBAtArea(
+ rStart.Tab(), rStart.Col(), rStart.Row(), rEnd.Col(), rEnd.Row() );
if ( pDBData )
{
rBtnHeader.Check( pDBData->HasHeader() );
pDBData->GetName( theDbName );
- if ( !pDBData->IsBuildin() )
+ if ( !pDBData->IsInternalUnnamed()
+ && !pDBData->IsInternalForAutoFilter() )
{
rBtnHeader.Disable();
}
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 40be175..0b97c58 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -592,7 +592,7 @@ sal_Bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam,
if (pDestData)
pNewData = pDestData; // Bereich vorhanden -> anpassen
else // Bereich ab Cursor/Markierung wird angelegt
- pNewData = rDocShell.GetDBData(aDestPos, SC_DB_MAKE_SORT, SC_DBSEL_FORCE_MARK );
+ pNewData = rDocShell.GetDBData(aDestPos, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );
if (pNewData)
{
pNewData->SetArea( nTab,
@@ -919,7 +919,7 @@ sal_Bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& rQueryParam,
pNewData = rDocShell.GetDBData(
ScRange( aLocalParam.nCol1, aLocalParam.nRow1, nDestTab,
aLocalParam.nCol2, aLocalParam.nRow2, nDestTab ),
- SC_DB_MAKE_FILTER, SC_DBSEL_FORCE_MARK );
+ SC_DB_MAKE, SC_DBSEL_FORCE_MARK );
if (pNewData)
{
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index 52d3c23..6f2129b 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -111,17 +111,21 @@ 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 )
+
+ScDBData* lcl_GetDBNearCursor(
+ const ScDBCollection* pColl,
+ const SCCOL nCol,
+ const SCROW nRow,
+ const SCTAB nTab )
{
//! nach document/dbcolect verschieben
if (!pColl)
return NULL;
- ScDBData* pNoNameData = NULL;
+ ScDBData* pInternalDBData = NULL;
ScDBData* pNearData = NULL;
sal_uInt16 nCount = pColl->GetCount();
- String aNoName = ScGlobal::GetRscString( STR_DB_NONAME );
SCTAB nAreaTab;
SCCOL nStartCol, nEndCol;
SCROW nStartRow, nEndRow;
@@ -129,14 +133,20 @@ ScDBData* lcl_GetDBNearCursor( ScDBCollection* pColl, SCCOL nCol, SCROW nRow, SC
{
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 ( nTab == nAreaTab
+ && nCol+1 >= nStartCol
+ && nCol <= nEndCol+1
+ && nRow+1 >= nStartRow
+ && nRow <= nEndRow+1 )
{
- if ( pDB->GetName() == aNoName )
- pNoNameData = pDB;
+ if ( pDB->IsInternalUnnamed()
+ || pDB->IsInternalForAutoFilter() )
+ {
+ pInternalDBData = pDB;
+ }
else if ( nCol < nStartCol || nCol > nEndCol || nRow < nStartRow || nRow > nEndRow )
{
- if (!pNearData)
+ if ( !pNearData )
pNearData = pDB; // ersten angrenzenden Bereich merken
}
else
@@ -145,60 +155,57 @@ ScDBData* lcl_GetDBNearCursor( ScDBCollection* pColl, SCCOL nCol, SCROW nRow, SC
}
if (pNearData)
return pNearData; // angrenzender, wenn nichts direkt getroffen
- return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden
+ return pInternalDBData;
}
ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel )
{
- if ( eMode == SC_DB_MAKE_FILTER || eMode == SC_DB_MAKE_SORT || eMode == SC_DB_MAKE_SUBTOTAL || eMode == SC_DB_OLD_FILTER )
- return GetDBDataAdd(rMarked, eMode, eSel);
- SCCOL nCol = rMarked.aStart.Col();
- SCROW nRow = rMarked.aStart.Row();
- SCTAB nTab = rMarked.aStart.Tab();
+ const SCCOL nCol = rMarked.aStart.Col();
+ const SCROW nRow = rMarked.aStart.Row();
+ const SCTAB nTab = rMarked.aStart.Tab();
SCCOL nStartCol = nCol;
SCROW nStartRow = nRow;
- SCTAB nStartTab = nTab;
SCCOL nEndCol = rMarked.aEnd.Col();
SCROW nEndRow = rMarked.aEnd.Row();
- SCTAB nEndTab = rMarked.aEnd.Tab();
-
- // Wegen #49655# nicht einfach GetDBAtCursor: Der zusammenhaengende Datenbereich
- // fuer "unbenannt" (GetDataArea) kann neben dem Cursor legen, also muss auch ein
- // benannter DB-Bereich dort gesucht werden.
- ScDBData* pData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow );
- if (!pData)
- pData = lcl_GetDBNearCursor( aDocument.GetDBCollection(), nCol, nRow, nTab );
+ ScDBData* pFoundDBData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow );
+ if ( pFoundDBData == NULL )
+ {
+ pFoundDBData = lcl_GetDBNearCursor( aDocument.GetDBCollection(), nCol, nRow, nTab );
+ }
- sal_Bool bSelected = ( eSel == SC_DBSEL_FORCE_MARK ||
- (rMarked.aStart != rMarked.aEnd && eSel != SC_DBSEL_ROW_DOWN) );
- bool bOnlyDown = (!bSelected && eSel == SC_DBSEL_ROW_DOWN && rMarked.aStart.Row() == rMarked.aEnd.Row());
+ const bool bSelected =
+ ( eSel == SC_DBSEL_FORCE_MARK
+ || ( rMarked.aStart != rMarked.aEnd
+ && eSel != SC_DBSEL_ROW_DOWN ) );
+ const bool bOnlyDown = ( !bSelected
+ && eSel == SC_DBSEL_ROW_DOWN
+ && rMarked.aStart.Row() == rMarked.aEnd.Row());
- sal_Bool bUseThis = sal_False;
- if (pData)
+ bool bUseFoundDBData = false;
+ if ( pFoundDBData )
{
- // Bereich nehmen, wenn nichts anderes markiert
-
+ // check, if found database range can be used
SCTAB nDummy;
SCCOL nOldCol1;
SCROW nOldRow1;
SCCOL nOldCol2;
SCROW nOldRow2;
- pData->GetArea( nDummy, nOldCol1,nOldRow1, nOldCol2,nOldRow2 );
-// sal_Bool bIsNoName = ( pData->GetName() == ScGlobal::GetRscString( STR_DB_NONAME ) );
- sal_Bool bIsNoName = pData->IsBuildin();
+ pFoundDBData->GetArea( nDummy, nOldCol1, nOldRow1, nOldCol2, nOldRow2 );
- if (!bSelected)
+ const bool bIsUnnamedOne = pFoundDBData->IsInternalUnnamed();
+ const bool bIsInternalForAutoFilter = pFoundDBData->IsInternalForAutoFilter();
+ if ( !bSelected )
{
- bUseThis = sal_True;
- if ( bIsNoName && eMode == SC_DB_MAKE )
+ bUseFoundDBData = true;
+ if ( ( bIsUnnamedOne || bIsInternalForAutoFilter )
+ && ( eMode == SC_DB_MAKE || eMode == SC_DB_MAKE_AUTOFILTER ) )
{
- // If nothing marked or only one row marked, adapt
- // "unbenannt"/"unnamed" to contiguous area.
+ // If nothing marked or only one row marked, adapt found database range to contiguous area.
nStartCol = nCol;
nStartRow = nRow;
- if (bOnlyDown)
+ if ( bOnlyDown )
{
nEndCol = rMarked.aEnd.Col();
nEndRow = rMarked.aEnd.Row();
@@ -210,50 +217,63 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
}
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown );
if ( nOldCol1 != nStartCol || nOldCol2 != nEndCol || nOldRow1 != nStartRow )
- bUseThis = sal_False; // passt gar nicht
+ {
+ bUseFoundDBData = false;
+ }
else if ( nOldRow2 != nEndRow )
{
- // Bereich auf neue End-Zeile erweitern
- pData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow );
+ // adapt found internal database range to new end row
+ pFoundDBData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow );
}
}
}
else
{
- if ( nOldCol1 == nStartCol && nOldRow1 == nStartRow &&
- nOldCol2 == nEndCol && nOldRow2 == nEndRow ) // genau markiert?
- bUseThis = sal_True;
+ if ( nOldCol1 == nStartCol
+ && nOldRow1 == nStartRow
+ && nOldCol2 == nEndCol
+ && nOldRow2 == nEndRow )
+ {
+ bUseFoundDBData = true;
+ }
else
- bUseThis = sal_False; // immer Markierung nehmen (Bug 11964)
+ {
+ bUseFoundDBData = false;
+ }
}
- // fuer Import nie "unbenannt" nehmen
+ // adapt internal unnamed database range to an auto filter one
+ // otherwise the auto filter is lost when the internal unnamed one is changed/reused/deleted
+ if ( bUseFoundDBData
+ && eMode == SC_DB_MAKE_AUTOFILTER
+ && bIsUnnamedOne )
+ {
+ pFoundDBData->SetName( aDocument.GetDBCollection()->GetNewDefaultDBName() );
+ }
- if ( bUseThis && eMode == SC_DB_IMPORT && bIsNoName )
- bUseThis = sal_False;
+ // no internal database range for Import
+ if ( bUseFoundDBData
+ && eMode == SC_DB_IMPORT
+ && ( bIsUnnamedOne || bIsInternalForAutoFilter ) )
+ {
+ bUseFoundDBData = false;
+ }
}
- if ( bUseThis )
+ if ( bUseFoundDBData )
{
- pData->GetArea( nStartTab, nStartCol,nStartRow, nEndCol,nEndRow );
- nEndTab = nStartTab;
+ return pFoundDBData;
}
- else if ( eMode == SC_DB_OLD )
+
+ if ( eMode == SC_DB_OLD )
{
- pData = NULL; // nichts gefunden
- nStartCol = nEndCol = nCol;
- nStartRow = nEndRow = nRow;
- nStartTab = nEndTab = nTab;
-// bMark = sal_False; // nichts zu markieren
+ // no existing database range found
+ return NULL;
}
- else
+ else // eMode == SC_DB_MAKE||SC_DB_IMPORT||SC_DB_MAKE_AUTOFILTER
{
- if ( bSelected )
+ if ( !bSelected )
{
-// bMark = sal_False;
- }
- else
- { // zusammenhaengender Bereich
nStartCol = nCol;
nStartRow = nRow;
if (bOnlyDown)
@@ -269,49 +289,52 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown );
}
- sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol,nStartRow, nEndCol,nEndRow, nTab );
+ const sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
- ScDBData* pNoNameData;
- sal_uInt16 nNoNameIndex;
+ ScDBData* pDBData = NULL;
+ sal_uInt16 nUnnamedDBIndex;
ScDBCollection* pColl = aDocument.GetDBCollection();
- if ( eMode != SC_DB_IMPORT &&
- pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) )
+ if ( eMode == SC_DB_MAKE &&
+ pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nUnnamedDBIndex ) )
{
- pNoNameData = (*pColl)[nNoNameIndex];
+ // adapt existing unnamed database range
+ pDBData = (*pColl)[nUnnamedDBIndex];
if ( !pOldAutoDBRange )
{
// store the old unnamed database range with its settings for undo
// (store at the first change, get the state before all changes)
- pOldAutoDBRange = new ScDBData( *pNoNameData );
+ pOldAutoDBRange = new ScDBData( *pDBData );
}
- SCCOL nOldX1; // alten Bereich sauber wegnehmen
- SCROW nOldY1; //! (UNDO ???)
+ SCCOL nOldX1;
+ SCROW nOldY1;
SCCOL nOldX2;
SCROW nOldY2;
SCTAB nOldTab;
- pNoNameData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
+ pDBData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
- pNoNameData->SetSortParam( ScSortParam() ); // Parameter zuruecksetzen
- pNoNameData->SetQueryParam( ScQueryParam() );
- pNoNameData->SetSubTotalParam( ScSubTotalParam() );
+ pDBData->SetSortParam( ScSortParam() );
+ pDBData->SetQueryParam( ScQueryParam() );
+ pDBData->SetSubTotalParam( ScSubTotalParam() );
- pNoNameData->SetArea( nTab, nStartCol,nStartRow, nEndCol,nEndRow ); // neu setzen
- pNoNameData->SetByRow( sal_True );
- pNoNameData->SetHeader( bHasHeader );
- pNoNameData->SetAutoFilter( sal_False );
+ pDBData->SetArea( nTab, nStartCol,nStartRow, nEndCol,nEndRow );
+ pDBData->SetByRow( sal_True );
+ pDBData->SetHeader( bHasHeader );
+ pDBData->SetAutoFilter( sal_False );
}
else
{
ScDBCollection* pUndoColl = NULL;
String aNewName;
- if (eMode==SC_DB_IMPORT)
+ switch ( eMode )
+ {
+ case SC_DB_IMPORT:
{
- aDocument.CompileDBFormula( sal_True ); // CreateFormulaString
- pUndoColl = new ScDBCollection( *pColl ); // Undo fuer Import1-Bereich
+ aDocument.CompileDBFormula( sal_True );
+ pUndoColl = new ScDBCollection( *pColl );
String aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT );
long nCount = 0;
@@ -324,197 +347,51 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
}
while (pColl->SearchName( aNewName, nDummy ));
}
- else
- //aNewName = ScGlobal::GetRscString( STR_DB_NONAME );
- aNewName = pColl->GetNewDefaultDBName();
-
- pNoNameData = new ScDBData( aNewName, nTab,
- nStartCol,nStartRow, nEndCol,nEndRow,
- sal_True, bHasHeader );
- pColl->Insert( pNoNameData );
+ break;
- if ( pUndoColl )
+ case SC_DB_MAKE_AUTOFILTER:
{
- aDocument.CompileDBFormula( sal_False ); // CompileFormulaString
+ aDocument.CompileDBFormula( sal_True );
+ pUndoColl = new ScDBCollection( *pColl );
- ScDBCollection* pRedoColl = new ScDBCollection( *pColl );
- GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) );
+ aNewName = pColl->GetNewDefaultDBName();
}
+ break;
- // neuen Bereich am Sba anmelden nicht mehr noetig
-
- // "Import1" etc am Navigator bekanntmachen
- if (eMode==SC_DB_IMPORT)
- SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
- }
- pData = pNoNameData;
- }
-
-// if (bMark)
-// MarkRange( ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab ), sal_False );
-
- return pData;
-}
-
-ScDBData* ScDocShell::GetDBDataAdd( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel )
-{
- SCCOL nCol = rMarked.aStart.Col();
- SCROW nRow = rMarked.aStart.Row();
- SCTAB nTab = rMarked.aStart.Tab();
-
- SCCOL nStartCol = nCol;
- SCROW nStartRow = nRow;
- SCCOL nEndCol = rMarked.aEnd.Col();
- SCROW nEndRow = rMarked.aEnd.Row();
-
- ScDBData* pData = NULL;
- ScDBData* pCursorData;
- pCursorData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow );
- if ( !pCursorData )
- pCursorData = aDocument.GetDBAtCursor( nStartCol, nStartRow, nTab );
-
- //Get DBData at current table
- ScDBData* pTableData = aDocument.GetDBAtTable( nTab, eMode );
-
- if ( eMode == SC_DB_OLD_FILTER )
- return pTableData;
-
- sal_Bool bSelected = ( eSel == SC_DBSEL_FORCE_MARK || rMarked.aStart != rMarked.aEnd );
- bool bOnlyDown = (!bSelected && eSel == SC_DBSEL_ROW_DOWN && rMarked.aStart.Row() == rMarked.aEnd.Row());
-
- sal_Bool bUseThis = sal_False;
- if (pCursorData)
- {
- SCTAB nDummy;
- SCCOL nOldCol1;
- SCROW nOldRow1;
- SCCOL nOldCol2;
- SCROW nOldRow2;
- pCursorData->GetArea( nDummy, nOldCol1,nOldRow1, nOldCol2,nOldRow2 );
- if ( !bSelected )
- {
- ScRange tmpRange;
- if ( !pCursorData->IsBuildin() && pCursorData->GetAdvancedQuerySource(tmpRange))
- bUseThis = sal_True;
- else
- {
- nStartCol = nCol;
- nStartRow = nRow;
- nEndCol = nStartCol;
- nEndRow = nStartRow;
- aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown );
- if ( nOldCol1 != nStartCol || nOldCol2 != nEndCol || nOldRow1 != nStartRow )
- bUseThis = sal_False;
- else
- {
- bUseThis = sal_True;
- if ( nOldRow2 != nEndRow )// Range of new end-line expand
- pCursorData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow );
- }
+ case SC_DB_MAKE:
+ {
+ aNewName = ScGlobal::GetRscString( STR_DB_NONAME );
}
+ break;
- }
- else
- {
- if ( nOldCol1 == nStartCol && nOldRow1 == nStartRow && nOldCol2 == nEndCol && nOldRow2 == nEndRow )
- bUseThis = sal_True;
- else
- bUseThis = sal_False; // Always take mark (Bug 11964)
- }
- }
+ default:
+ DBG_ERROR( "<ScDocShell::GetDBData(..)> - unexcepted <eMode>" );
+ break;
+ }
- if ( bUseThis )
- {
- pData = pCursorData;
- if ( pTableData && eMode == SC_DB_MAKE_FILTER && !(*pTableData == *pCursorData ) )
- {
- if ( !pOldAutoDBRange )
- pOldAutoDBRange = new ScDBData(*pTableData);
- SCCOL nOldX1;
- SCROW nOldY1;
- SCCOL nOldX2;
- SCROW nOldY2;
- SCTAB nOldTab;
- pTableData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
+ pDBData = new ScDBData(
+ aNewName, nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_True, bHasHeader );
+ pColl->Insert( pDBData );
- if (pTableData->HasQueryParam())
+ if ( pUndoColl )
{
- ScQueryParam aParam;
- pTableData->GetQueryParam(aParam);
- SCSIZE nEC = aParam.GetEntryCount();
- for (SCSIZE i=0; i<nEC; i++)
- aParam.GetEntry(i).bDoQuery = sal_False;
- aParam.bDuplicate = sal_True;
- ScDBDocFunc aDBDocFunc( *this );
- aDBDocFunc.Query( nTab, aParam, NULL, sal_False, sal_False );
- }
+ aDocument.CompileDBFormula( sal_False );
- DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
- pTableData->SetQueryParam( ScQueryParam() );
- pTableData->SetAutoFilter( sal_False );
- }
-
- }
- else
- {
- if ( bSelected )
- {
-// bMark = sal_False;
- }
- else
- {
- nStartCol = nCol;
- nStartRow = nRow;
- nEndCol = nStartCol;
- nEndRow = nStartRow;
- aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown );
- }
- sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol,nStartRow, nEndCol,nEndRow, nTab );
- ScDBCollection* pColl = aDocument.GetDBCollection();
- if ( pTableData )
- {
- if ( !pOldAutoDBRange )
- pOldAutoDBRange = new ScDBData(*pTableData);
- SCCOL nOldX1;
- SCROW nOldY1;
- SCCOL nOldX2;
- SCROW nOldY2;
- SCTAB nOldTab;
- pTableData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
+ ScDBCollection* pRedoColl = new ScDBCollection( *pColl );
+ GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) );
+ }
- if (pTableData->HasQueryParam())
+ // notify Navigator about database range "Import[X]"
+ if ( eMode==SC_DB_IMPORT )
{
- ScQueryParam aParam;
- pTableData->GetQueryParam(aParam);
- SCSIZE nEC = aParam.GetEntryCount();
- for (SCSIZE i=0; i<nEC; i++)
- aParam.GetEntry(i).bDoQuery = sal_False;
- aParam.bDuplicate = sal_True;
- ScDBDocFunc aDBDocFunc( *this );
- aDBDocFunc.Query( nTab, aParam, NULL, sal_False, sal_False );
+ SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
}
-
- DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
-
- pTableData->SetSortParam( ScSortParam() );
- pTableData->SetQueryParam( ScQueryParam() );
- pTableData->SetSubTotalParam( ScSubTotalParam() );
-
- pTableData->SetArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow );
- pTableData->SetByRow( sal_True );
- pTableData->SetHeader( bHasHeader );
- pTableData->SetAutoFilter( sal_False );
}
- else
- {
- String aNewName = pColl->GetNewDefaultDBName();
- pTableData = new ScDBData( aNewName, nTab, nStartCol,nStartRow, nEndCol,nEndRow, sal_True, bHasHeader );
- pColl->Insert( pTableData );
- }
- pData = pTableData;
+
+ return pDBData;
}
- return pData;
+ return NULL; // never reached
}
@@ -657,18 +534,19 @@ void ScDocShell::RefreshPivotTables( const ScRange& rSource )
String lcl_GetAreaName( ScDocument* pDoc, ScArea* pArea )
{
String aName;
- sal_Bool bOk = sal_False;
- ScDBData* pData = pDoc->GetDBAtArea( pArea->nTab, pArea->nColStart, pArea->nRowStart,
- pArea->nColEnd, pArea->nRowEnd );
+ bool bOk = false;
+ ScDBData* pData = pDoc->GetDBAtArea( pArea->nTab, pArea->nColStart, pArea->nRowStart, pArea->nColEnd, pArea->nRowEnd );
if (pData)
{
pData->GetName( aName );
- if ( aName != ScGlobal::GetRscString( STR_DB_NONAME ) )
- bOk = sal_True;
+ if ( !pData->IsInternalUnnamed() )
+ bOk = true;
}
if (!bOk)
+ {
pDoc->GetName( pArea->nTab, aName );
+ }
return aName;
}
diff --git a/sc/source/ui/inc/dbfunc.hxx b/sc/source/ui/inc/dbfunc.hxx
index 39a9fae..141286b 100644
--- a/sc/source/ui/inc/dbfunc.hxx
+++ b/sc/source/ui/inc/dbfunc.hxx
@@ -75,7 +75,6 @@ public:
// DB-Bereich vom Cursor
ScDBData* GetDBData( sal_Bool bMarkArea = sal_True, ScGetDBMode eMode = SC_DB_MAKE, ScGetDBSelection eSel = SC_DBSEL_KEEP );
- //ScRange GetDBRange( BOOL bMark, bool bIgnoreNotes );
void NotifyCloseDbNameDlg( const ScDBCollection& rNewColl, const List& rDelAreaList );
void Consolidate( const ScConsolidateParam& rParam, sal_Bool bRecord = sal_True );
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index c22747f..1a121d80 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -158,7 +158,6 @@ class SC_DLLPUBLIC ScDocShell: public SfxObjectShell, public SfxListener
SC_DLLPRIVATE void EnableSharedSettings( bool bEnable );
SC_DLLPRIVATE ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > LoadSharedDocument();
- ScDBData* GetDBDataAdd( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel );
SC_DLLPRIVATE void UseSheetSaveEntries();
@@ -307,7 +306,6 @@ public:
ScDBData* GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel );
ScDBData* GetOldAutoDBRange(); // has to be deleted by caller!
void CancelAutoDBRange(); // called when dialog is cancelled
- ScDBCollection* GetDBCollection(){ return aDocument.GetDBCollection();}
void UpdateLinks(); // Link-Eintraege aktuallisieren
sal_Bool ReloadTabLinks(); // Links ausfuehren (Inhalt aktualisieren)
diff --git a/sc/source/ui/navipi/content.cxx b/sc/source/ui/navipi/content.cxx
index 1a5bb02..8d42d37 100644
--- a/sc/source/ui/navipi/content.cxx
+++ b/sc/source/ui/navipi/content.cxx
@@ -729,14 +729,15 @@ 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 )
- if ( !pData->IsBuildin() )
+ if ( !pData->IsInternalUnnamed()
+ && !pData->IsInternalForAutoFilter() )
+ {
InsertContent( SC_CONTENT_DBAREA, aStrName );
+ }
}
}
}
diff --git a/sc/source/ui/undo/undoutil.cxx b/sc/source/ui/undo/undoutil.cxx
index 16d3963..c4b345b 100644
--- a/sc/source/ui/undo/undoutil.cxx
+++ b/sc/source/ui/undo/undoutil.cxx
@@ -82,33 +82,44 @@ void ScUndoUtil::MarkSimpleBlock( ScDocShell* pDocShell,
ScDBData* ScUndoUtil::GetOldDBData( ScDBData* pUndoData, ScDocument* pDoc, SCTAB nTab,
- SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
+ SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
{
ScDBData* pRet = pDoc->GetDBAtArea( nTab, nCol1, nRow1, nCol2, nRow2 );
if (!pRet)
{
- sal_Bool bWasTemp = sal_False;
+ bool bWasInternalUnnamed = false;
+ bool bWasInternalForAutoFilter = false;
if ( pUndoData )
{
String aName;
pUndoData->GetName( aName );
-// if ( aName == ScGlobal::GetRscString( STR_DB_NONAME ) )
- if (pUndoData->IsBuildin())
- bWasTemp = sal_True;
+ if ( pUndoData->IsInternalUnnamed() )
+ {
+ bWasInternalUnnamed = true;
+ }
+ else if (pUndoData->IsInternalForAutoFilter())
+ {
+ bWasInternalForAutoFilter = true;
+ }
}
- DBG_ASSERT(bWasTemp, "Undo: didn't find database range");
+ DBG_ASSERT( bWasInternalUnnamed || bWasInternalForAutoFilter, "Undo: didn't find database range");
sal_uInt16 nIndex;
ScDBCollection* pColl = pDoc->GetDBCollection();
- if (pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nIndex ))
+ if ( bWasInternalUnnamed
+ && pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nIndex ))
+ {
pRet = (*pColl)[nIndex];
+ }
else
{
- String aNoNamed = pColl->GetNewDefaultDBName();
- pRet = new ScDBData( aNoNamed/*ScGlobal::GetRscString( STR_DB_NONAME )*/, nTab,
- nCol1,nRow1, nCol2,nRow2, sal_True,
- pDoc->HasColHeader( nCol1,nRow1,nCol2,nRow2,nTab ) );
+ String aNewNamed = bWasInternalForAutoFilter
+ ? pColl->GetNewDefaultDBName()
+ : ScGlobal::GetRscString( STR_DB_NONAME );
+ pRet = new ScDBData(
+ aNewNamed, nTab, nCol1,nRow1, nCol2,nRow2, sal_True,
+ pDoc->HasColHeader( nCol1,nRow1,nCol2,nRow2,nTab ) );
pColl->Insert( pRet );
}
}
diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx
index f6c68fc..c26936d 100644
--- a/sc/source/ui/view/cellsh2.cxx
+++ b/sc/source/ui/view/cellsh2.cxx
@@ -357,8 +357,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
ScSubTotalParam aSubTotalParam;
SfxItemSet aArgSet( GetPool(), SCITEM_SUBTDATA, SCITEM_SUBTDATA );
- //ScDBData* pDBData = pTabViewShell->GetDBData();
- ScDBData* pDBData = pTabViewShell->GetDBData(sal_True, SC_DB_MAKE_SUBTOTAL);
+ ScDBData* pDBData = pTabViewShell->GetDBData();
pDBData->GetSubTotalParam( aSubTotalParam );
aSubTotalParam.bRemoveOnly = sal_False;
@@ -412,7 +411,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
//#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data
//the patch comes from maoyg
ScSortParam aSortParam;
- ScDBData* pDBData = pTabViewShell->GetDBData(sal_True, SC_DB_MAKE_SORT);
+ ScDBData* pDBData = pTabViewShell->GetDBData();
ScViewData* pData = GetViewData();
pDBData->GetSortParam( aSortParam );
@@ -463,7 +462,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
if ( pArgs ) // Basic
{
ScSortParam aSortParam;
- ScDBData* pDBData = pTabViewShell->GetDBData(sal_True, SC_DB_MAKE_SORT);
+ ScDBData* pDBData = pTabViewShell->GetDBData();
ScViewData* pData = GetViewData();
pDBData->GetSortParam( aSortParam );
@@ -526,7 +525,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
else
{
ScSortParam aSortParam;
- ScDBData* pDBData = pTabViewShell->GetDBData(sal_True, SC_DB_MAKE_SORT);
+ ScDBData* pDBData = pTabViewShell->GetDBData();
ScViewData* pData = GetViewData();
pDBData->GetSortParam( aSortParam );
@@ -681,7 +680,7 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
case SID_UNFILTER:
{
ScQueryParam aParam;
- ScDBData* pDBData = pTabViewShell->GetDBData(sal_True, SC_DB_OLD_FILTER);
+ ScDBData* pDBData = pTabViewShell->GetDBData();
pDBData->GetQueryParam( aParam );
SCSIZE nEC = aParam.GetEntryCount();
@@ -945,7 +944,6 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
if ( pDBCol )
{
- const String aStrNoName( ScGlobal::GetRscString(STR_DB_NONAME) );
List aList;
sal_uInt16 nDBCount = pDBCol->GetCount();
ScDBData* pDbData = NULL;
@@ -959,18 +957,13 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq )
pDBName = new String;
pDbData->GetName( *pDBName );
- if ( *pDBName != aStrNoName )
+ if ( !pDbData->IsInternalUnnamed() )
aList.Insert( pDBName );
else
DELETEZ(pDBName);
}
}
-//CHINA001 ScSelEntryDlg* pDlg =
-//CHINA001 new ScSelEntryDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_SELECTDB,
-//CHINA001 String(ScResId(SCSTR_SELECTDB)),
-//CHINA001 String(ScResId(SCSTR_AREAS)),
-//CHINA001 aList );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx
index f82507a..c0771d0 100644
--- a/sc/source/ui/view/dbfunc.cxx
+++ b/sc/source/ui/view/dbfunc.cxx
@@ -332,119 +332,119 @@ void ScDBFunc::ToggleAutoFilter()
ScDocShell* pDocSh = GetViewData()->GetDocShell();
ScDocShellModificator aModificator( *pDocSh );
- ScQueryParam aParam;
- ScDocument* pDoc = GetViewData()->GetDocument();
- ScDBData* pDBData = GetDBData( sal_False, SC_DB_OLD_FILTER, SC_DBSEL_ROW_DOWN );
-
-
+ ScDBData* pDBData = GetDBData( sal_False, SC_DB_MAKE_AUTOFILTER, SC_DBSEL_ROW_DOWN );
+ if ( pDBData == NULL )
+ {
+ return;
+ }
+ // use a list action for the AutoFilter buttons (ScUndoAutoFilter) and the filter operation
+ const String aUndo = ScGlobal::GetRscString( STR_UNDO_QUERY );
+ pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
- SCCOL nCol;
- SCROW nRow;
- SCTAB nTab = GetViewData()->GetTabNo();
- sal_Int16 nFlag;
- //sal_Bool bHasAuto = sal_True;
- sal_Bool bHeader;
- sal_Bool bPaint = sal_False;
+ pDBData->SetByRow( sal_True );
+ ScQueryParam aParam;
+ pDBData->GetQueryParam( aParam );
- //! stattdessen aus DB-Bereich abfragen?
+ ScDocument* pDoc = GetViewData()->GetDocument();
- /*for (nCol=aParam.nCol1; nCol<=aParam.nCol2 && bHasAuto; nCol++)
+ bool bHasAutoFilter = true;
+ const SCROW nRow = aParam.nRow1;
+ const SCTAB nTab = GetViewData()->GetTabNo();
+ for ( SCCOL nCol=aParam.nCol1; nCol<=aParam.nCol2 && bHasAutoFilter; ++nCol )
{
- nFlag = ((ScMergeFlagAttr*) pDoc->
- GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG ))->GetValue();
+ const sal_Int16 nFlag =
+ ((ScMergeFlagAttr*) pDoc->GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG ))->GetValue();
if ( (nFlag & SC_MF_AUTO) == 0 )
- bHasAuto = sal_False;
- }*/
+ bHasAutoFilter = false;
+ }
- if (pDBData && pDBData->HasAutoFilter()) // aufheben
+ bool bPaint = false;
+
+ if ( bHasAutoFilter )
{
- // Filterknoepfe ausblenden
- pDBData->SetByRow( sal_True ); //! Undo, vorher abfragen ??
- pDBData->GetQueryParam( aParam );
- nRow = aParam.nRow1;
- bHeader = pDBData->HasHeader();
- for (nCol=aParam.nCol1; nCol<=aParam.nCol2; nCol++)
+ // switch filter buttons
+ for ( SCCOL nCol=aParam.nCol1; nCol<=aParam.nCol2; ++nCol )
{
- nFlag = ((ScMergeFlagAttr*) pDoc->
- GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG ))->GetValue();
+ const sal_Int16 nFlag =
+ ((ScMergeFlagAttr*) pDoc->GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG ))->GetValue();
pDoc->ApplyAttr( nCol, nRow, nTab, ScMergeFlagAttr( nFlag & ~SC_MF_AUTO ) );
}
- // use a list action for the AutoFilter buttons (ScUndoAutoFilter) and the filter operation
-
- String aUndo = ScGlobal::GetRscString( STR_UNDO_QUERY );
- pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
-
ScRange aRange;
pDBData->GetArea( aRange );
- pDocSh->GetUndoManager()->AddUndoAction(
- new ScUndoAutoFilter( pDocSh, aRange, pDBData->GetName(), sal_False ) );
+ pDocSh->GetUndoManager()->AddUndoAction( new ScUndoAutoFilter( pDocSh, aRange, pDBData->GetName(), sal_False ) );
pDBData->SetAutoFilter(sal_False);
- // Filter aufheben (incl. Paint / Undo)
-
- SCSIZE nEC = aParam.GetEntryCount();
- for (SCSIZE i=0; i<nEC; i++)
+ // switch off filter
+ const SCSIZE nEC = aParam.GetEntryCount();
+ for ( SCSIZE i=0; i<nEC; ++i )
+ {
aParam.GetEntry(i).bDoQuery = sal_False;
+ }
aParam.bDuplicate = sal_True;
Query( aParam, NULL, sal_True );
- pDocSh->GetUndoManager()->LeaveListAction();
+ // delete internal database range for auto filter
+ if ( pDBData->IsInternalForAutoFilter() )
+ {
+ ScDBDocFunc aFunc(*pDocSh);
+ aFunc.DeleteDBRange( pDBData->GetName(), sal_False );
+ }
+ pDBData = NULL;
- bPaint = sal_True;
+ bPaint = true;
}
- else // Filterknoepfe einblenden
+ else
{
- pDBData = GetDBData(sal_False, SC_DB_MAKE_FILTER);
- pDBData->SetByRow(sal_True);
- pDBData->GetQueryParam(aParam);
- nRow = aParam.nRow1;
- bHeader = pDBData->HasHeader();
-
- if ( !pDoc->IsBlockEmpty( nTab,
- aParam.nCol1, aParam.nRow1,
- aParam.nCol2, aParam.nRow2 ) )
+ if ( !pDoc->IsBlockEmpty(
+ nTab,
+ aParam.nCol1,
+ aParam.nRow1,
+ aParam.nCol2,
+ aParam.nRow2 ) )
{
- if (!bHeader)
+ if ( !pDBData->HasHeader() )
{
- if ( MessBox( GetViewData()->GetDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES),
- ScGlobal::GetRscString( STR_MSSG_DOSUBTOTALS_0 ), // "StarCalc"
- ScGlobal::GetRscString( STR_MSSG_MAKEAUTOFILTER_0 ) // Koepfe aus erster Zeile?
- ).Execute() == RET_YES )
+ if ( MessBox(
+ GetViewData()->GetDialogParent(),
+ WinBits(WB_YES_NO | WB_DEF_YES),
+ ScGlobal::GetRscString( STR_MSSG_DOSUBTOTALS_0 ),
+ ScGlobal::GetRscString( STR_MSSG_MAKEAUTOFILTER_0 ) ).Execute() == RET_YES )
{
- pDBData->SetHeader( sal_True ); //! Undo ??
- bHeader = sal_True;
+ pDBData->SetHeader( sal_True );
}
}
ScRange aRange;
pDBData->GetArea( aRange );
- pDocSh->GetUndoManager()->AddUndoAction(
- new ScUndoAutoFilter( pDocSh, aRange, pDBData->GetName(), sal_True ) );
+ pDocSh->GetUndoManager()->AddUndoAction( new ScUndoAutoFilter( pDocSh, aRange, pDBData->GetName(), sal_True ) );
pDBData->SetAutoFilter(sal_True);
- for (nCol=aParam.nCol1; nCol<=aParam.nCol2; nCol++)
+ for ( SCCOL nCol=aParam.nCol1; nCol<=aParam.nCol2; ++nCol )
{
- nFlag = ((ScMergeFlagAttr*) pDoc->
- GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG ))->GetValue();
+ const sal_Int16 nFlag =
+ ((ScMergeFlagAttr*) pDoc->GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG ))->GetValue();
pDoc->ApplyAttr( nCol, nRow, nTab, ScMergeFlagAttr( nFlag | SC_MF_AUTO ) );
}
- pDocSh->PostPaint( aParam.nCol1, nRow, nTab, aParam.nCol2, nRow, nTab,
- PAINT_GRID );
- bPaint = sal_True;
+ pDocSh->PostPaint( aParam.nCol1, nRow, nTab, aParam.nCol2, nRow, nTab, PAINT_GRID );
+ bPaint = true;
}
else
{
- ErrorBox aErrorBox( GetViewData()->GetDialogParent(), WinBits( WB_OK | WB_DEF_OK ),
- ScGlobal::GetRscString( STR_ERR_AUTOFILTER ) );
+ ErrorBox aErrorBox(
+ GetViewData()->GetDialogParent(),
+ WinBits( WB_OK | WB_DEF_OK ),
+ ScGlobal::GetRscString( STR_ERR_AUTOFILTER ) );
aErrorBox.Execute();
}
}
+ pDocSh->GetUndoManager()->LeaveListAction();
+
if ( bPaint )
{
aModificator.SetDocumentModified();
@@ -462,30 +462,41 @@ void ScDBFunc::HideAutoFilter()
ScDocShell* pDocSh = GetViewData()->GetDocShell();
ScDocShellModificator aModificator( *pDocSh );
- ScDocument* pDoc = pDocSh->GetDocument();
-
- ScQueryParam aParam;
- //ScDBData* pDBData = GetDBData( FALSE );
- ScDBData* pDBData = GetDBData(sal_False, SC_DB_OLD_FILTER);
-
+ ScDBData* pDBData = GetDBData( sal_False );
SCTAB nTab;
SCCOL nCol1, nCol2;
SCROW nRow1, nRow2;
pDBData->GetArea(nTab, nCol1, nRow1, nCol2, nRow2);
- for (SCCOL nCol=nCol1; nCol<=nCol2; nCol++)
{
- sal_Int16 nFlag = ((ScMergeFlagAttr*) pDoc->
- GetAttr( nCol, nRow1, nTab, ATTR_MERGE_FLAG ))->GetValue();
- pDoc->ApplyAttr( nCol, nRow1, nTab, ScMergeFlagAttr( nFlag & ~SC_MF_AUTO ) );
+ ScDocument* pDoc = pDocSh->GetDocument();
+ for (SCCOL nCol=nCol1; nCol<=nCol2; nCol++)
+ {
+ const sal_Int16 nFlag =
+ ((ScMergeFlagAttr*) pDoc->GetAttr( nCol, nRow1, nTab, ATTR_MERGE_FLAG ))->GetValue();
+ pDoc->ApplyAttr( nCol, nRow1, nTab, ScMergeFlagAttr( nFlag & ~SC_MF_AUTO ) );
+ }
}
- ScRange aRange;
- pDBData->GetArea( aRange );
- pDocSh->GetUndoManager()->AddUndoAction(
- new ScUndoAutoFilter( pDocSh, aRange, pDBData->GetName(), sal_False ) );
+ const String aUndo = ScGlobal::GetRscString( STR_UNDO_QUERY );
+ pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
+ {
+ ScRange aRange;
+ pDBData->GetArea( aRange );
+ pDocSh->GetUndoManager()->AddUndoAction(
+ new ScUndoAutoFilter( pDocSh, aRange, pDBData->GetName(), sal_False ) );
- pDBData->SetAutoFilter(sal_False);
+ pDBData->SetAutoFilter(sal_False);
+
+ // delete internal database range for auto filter
+ if ( pDBData->IsInternalForAutoFilter() )
+ {
+ ScDBDocFunc aFunc(*pDocSh);
+ aFunc.DeleteDBRange( pDBData->GetName(), sal_False );
+ }
+ pDBData = NULL;
+ }
+ pDocSh->GetUndoManager()->LeaveListAction();
pDocSh->PostPaint( nCol1,nRow1,nTab, nCol2,nRow1,nTab, PAINT_GRID );
aModificator.SetDocumentModified();
diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx
index 42c07bd..f5bd19d2 100644
--- a/sc/source/ui/view/tabvwshc.cxx
+++ b/sc/source/ui/view/tabvwshc.cxx
@@ -171,7 +171,7 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog(
SCITEM_QUERYDATA,
SCITEM_QUERYDATA );
- ScDBData* pDBData = GetDBData( sal_True, SC_DB_MAKE_FILTER, SC_DBSEL_ROW_DOWN);
+ ScDBData* pDBData = GetDBData( sal_True, SC_DB_MAKE, SC_DBSEL_ROW_DOWN);
pDBData->GetQueryParam( aQueryParam );
ScQueryItem aItem( SCITEM_QUERYDATA, GetViewData(), &aQueryParam );
@@ -196,7 +196,7 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog(
SCITEM_QUERYDATA,
SCITEM_QUERYDATA );
- ScDBData* pDBData = GetDBData( sal_True, SC_DB_MAKE_FILTER, SC_DBSEL_ROW_DOWN);
+ ScDBData* pDBData = GetDBData( sal_True, SC_DB_MAKE, SC_DBSEL_ROW_DOWN);
pDBData->GetQueryParam( aQueryParam );
aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA,
More information about the Libreoffice-commits
mailing list