diff options
Diffstat (limited to 'binfilter/bf_sc/source/core/data/sc_dociter.cxx')
-rw-r--r-- | binfilter/bf_sc/source/core/data/sc_dociter.cxx | 997 |
1 files changed, 0 insertions, 997 deletions
diff --git a/binfilter/bf_sc/source/core/data/sc_dociter.cxx b/binfilter/bf_sc/source/core/data/sc_dociter.cxx deleted file mode 100644 index abcf5a17368f..000000000000 --- a/binfilter/bf_sc/source/core/data/sc_dociter.cxx +++ /dev/null @@ -1,997 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifdef _MSC_VER -#pragma hdrstop -#endif - -// INCLUDE --------------------------------------------------------------- - -#include <bf_svtools/zforlist.hxx> - -#include "dociter.hxx" -#include "document.hxx" -#include "cell.hxx" -#include "attarray.hxx" -#include "docoptio.hxx" -namespace binfilter { - -//------------------------------------------------------------------------ -//------------------------------------------------------------------------ -void lcl_IterGetNumberFormat( ULONG& nFormat, const ScAttrArray*& rpArr, - USHORT& nAttrEndRow, const ScAttrArray* pNewArr, USHORT nRow, - ScDocument* pDoc ) -{ - DBG_BF_ASSERT(0, "STRIP"); //STRIP001 if ( rpArr != pNewArr || nAttrEndRow < nRow ) -} - -/*N*/ ScValueIterator::ScValueIterator( ScDocument* pDocument, const ScRange& rRange, -/*N*/ BOOL bSTotal, BOOL bTextZero ) : -/*N*/ pDoc( pDocument ), -/*N*/ nStartCol( rRange.aStart.Col() ), -/*N*/ nStartRow( rRange.aStart.Row() ), -/*N*/ nStartTab( rRange.aStart.Tab() ), -/*N*/ nEndCol( rRange.aEnd.Col() ), -/*N*/ nEndRow( rRange.aEnd.Row() ), -/*N*/ nEndTab( rRange.aEnd.Tab() ), -/*N*/ bSubTotal(bSTotal), -/*N*/ nNumFmtType( NUMBERFORMAT_UNDEFINED ), -/*N*/ nNumFmtIndex(0), -/*N*/ bNumValid( FALSE ), -/*N*/ bNextValid( FALSE ), -/*N*/ bCalcAsShown( pDocument->GetDocOptions().IsCalcAsShown() ), -/*N*/ bTextAsZero( bTextZero ) -/*N*/ { -/*N*/ PutInOrder( nStartCol, nEndCol); -/*N*/ PutInOrder( nStartRow, nEndRow); -/*N*/ PutInOrder( nStartTab, nEndTab ); -/*N*/ -/*N*/ if (nStartCol > MAXCOL) nStartCol = MAXCOL; -/*N*/ if (nEndCol > MAXCOL) nEndCol = MAXCOL; -/*N*/ if (nStartRow > MAXROW) nStartRow = MAXROW; -/*N*/ if (nEndRow > MAXROW) nEndRow = MAXROW; -/*N*/ if (nStartTab > MAXTAB) nStartTab = MAXTAB; -/*N*/ if (nEndTab > MAXTAB) nEndTab = MAXTAB; -/*N*/ -/*N*/ nCol = nStartCol; -/*N*/ nRow = nStartRow; -/*N*/ nTab = nStartTab; -/*N*/ -/*N*/ nColRow = 0; // wird bei GetFirst initialisiert -/*N*/ -/*N*/ nNumFormat = 0; // werden bei GetNumberFormat initialisiert -/*N*/ pAttrArray = 0; -/*N*/ nAttrEndRow = 0; -/*N*/ } - -/*N*/ BOOL ScValueIterator::GetThis(double& rValue, USHORT& rErr) -/*N*/ { -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ for (;;) -/*N*/ { -/*N*/ if ( nRow > nEndRow ) -/*N*/ { -/*N*/ nRow = nStartRow; -/*N*/ do -/*N*/ { -/*N*/ nCol++; -/*N*/ if ( nCol > nEndCol ) -/*N*/ { -/*N*/ nCol = nStartCol; -/*N*/ nTab++; -/*N*/ if ( nTab > nEndTab ) -/*N*/ { -/*N*/ rValue = 0.0; -/*N*/ rErr = 0; -/*N*/ return FALSE; // Ende und Aus -/*N*/ } -/*N*/ } -/*N*/ pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ } while ( pCol->nCount == 0 ); -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ } -/*N*/ -/*N*/ while (( nColRow < pCol->nCount ) && ( pCol->pItems[nColRow].nRow < nRow )) -/*N*/ nColRow++; -/*N*/ -/*N*/ if ( nColRow < pCol->nCount && pCol->pItems[nColRow].nRow <= nEndRow ) -/*N*/ { -/*N*/ nRow = pCol->pItems[nColRow].nRow + 1; -/*N*/ if ( !bSubTotal || !pDoc->pTab[nTab]->IsFiltered( nRow-1 ) ) -/*N*/ { -/*N*/ ScBaseCell* pCell = pCol->pItems[nColRow].pCell; -/*N*/ ++nColRow; -/*N*/ switch (pCell->GetCellType()) -/*N*/ { -/*N*/ case CELLTYPE_VALUE: -/*N*/ { -/*N*/ bNumValid = FALSE; -/*N*/ rValue = ((ScValueCell*)pCell)->GetValue(); -/*N*/ rErr = 0; -/*N*/ --nRow; -/*N*/ if ( bCalcAsShown ) -/*N*/ { -/*?*/ #ifndef WTC -/*?*/ lcl_IterGetNumberFormat( nNumFormat,pAttrArray, -/*?*/ #else -/*?*/ lcl_IterGetNumberFormat( nNumFormat, -/*?*/ (ScAttrArray const *&)pAttrArray, -/*?*/ #endif -/*?*/ nAttrEndRow, pCol->pAttrArray, nRow, pDoc ); -/*?*/ rValue = pDoc->RoundValueAsShown( rValue, nNumFormat ); -/*N*/ } -/*N*/ // -/*N*/ // wenn in der selben Spalte gleich noch eine Value-Cell folgt, die -/*N*/ // auch noch im Block liegt, den Wert jetzt schon holen -/*N*/ // -/*N*/ if ( nColRow < pCol->nCount && -/*N*/ pCol->pItems[nColRow].nRow <= nEndRow && -/*N*/ pCol->pItems[nColRow].pCell->GetCellType() == CELLTYPE_VALUE && -/*N*/ !bSubTotal ) -/*N*/ { -/*N*/ fNextValue = ((ScValueCell*)pCol->pItems[nColRow].pCell)->GetValue(); -/*N*/ nNextRow = pCol->pItems[nColRow].nRow; -/*N*/ bNextValid = TRUE; -/*N*/ if ( bCalcAsShown ) -/*N*/ { -/*?*/ #ifndef WTC -/*?*/ lcl_IterGetNumberFormat( nNumFormat, pAttrArray, -/*?*/ #else -/*?*/ lcl_IterGetNumberFormat( nNumFormat, -/*?*/ (ScAttrArray const *&)pAttrArray, -/*?*/ #endif -/*?*/ nAttrEndRow, pCol->pAttrArray, nNextRow, pDoc ); -/*?*/ fNextValue = pDoc->RoundValueAsShown( fNextValue, nNumFormat ); -/*N*/ } -/*N*/ } -/*N*/ -/*N*/ return TRUE; // gefunden -/*N*/ } -/*N*/ break; -/*N*/ case CELLTYPE_FORMULA: -/*N*/ { -/*N*/ if (!bSubTotal || !((ScFormulaCell*)pCell)->IsSubTotal()) -/*N*/ { -/*N*/ rErr = ((ScFormulaCell*)pCell)->GetErrCode(); -/*N*/ if ( rErr || ((ScFormulaCell*)pCell)->IsValue() ) -/*N*/ { -/*N*/ rValue = ((ScFormulaCell*)pCell)->GetValue(); -/*N*/ nRow--; -/*N*/ bNumValid = FALSE; -/*N*/ return TRUE; // gefunden -/*N*/ } -/*N*/ } -/*N*/ } -/*N*/ break; -/*N*/ case CELLTYPE_STRING : -/*N*/ case CELLTYPE_EDIT : -/*N*/ { -/*N*/ if ( bTextAsZero ) -/*N*/ { -/*N*/ rErr = 0; -/*N*/ rValue = 0.0; -/*N*/ nNumFmtType = NUMBERFORMAT_NUMBER; -/*N*/ nNumFmtIndex = 0; -/*N*/ bNumValid = TRUE; -/*N*/ --nRow; -/*N*/ return TRUE; -/*N*/ } -/*N*/ } -/*N*/ break; -/*N*/ } -/*N*/ } -/*N*/ } -/*N*/ else -/*N*/ nRow = nEndRow + 1; // naechste Spalte -/*N*/ } -/*N*/ } - -/*N*/ void ScValueIterator::GetCurNumFmtInfo( short& nType, ULONG& nIndex ) -/*N*/ { -/*N*/ if (!bNumValid) -/*N*/ { -/*N*/ const ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ nNumFmtIndex = pCol->GetNumberFormat( nRow ); -/*N*/ if ( (nNumFmtIndex % SV_COUNTRY_LANGUAGE_OFFSET) == 0 ) -/*N*/ { -/*N*/ const ScBaseCell* pCell; -/*N*/ USHORT nIdx = nColRow - 1; -/*N*/ // there might be rearranged something, so be on the safe side -/*N*/ if ( nIdx < pCol->nCount && pCol->pItems[nIdx].nRow == nRow ) -/*N*/ pCell = pCol->pItems[nIdx].pCell; -/*N*/ else -/*N*/ { -/*?*/ if ( pCol->Search( nRow, nIdx ) ) -/*?*/ pCell = pCol->pItems[nIdx].pCell; -/*?*/ else -/*?*/ pCell = NULL; -/*N*/ } -/*N*/ if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) -/*N*/ ((const ScFormulaCell*)pCell)->GetFormatInfo( nNumFmtType, nNumFmtIndex ); -/*N*/ else -/*N*/ nNumFmtType = pDoc->GetFormatTable()->GetType( nNumFmtIndex ); -/*N*/ } -/*N*/ else -/*N*/ nNumFmtType = pDoc->GetFormatTable()->GetType( nNumFmtIndex ); -/*N*/ bNumValid = TRUE; -/*N*/ } -/*N*/ nType = nNumFmtType; -/*N*/ nIndex = nNumFmtIndex; -/*N*/ } - -/*N*/ BOOL ScValueIterator::GetFirst(double& rValue, USHORT& rErr) -/*N*/ { -/*N*/ nCol = nStartCol; -/*N*/ nRow = nStartRow; -/*N*/ nTab = nStartTab; -/*N*/ -/*N*/ // nColRow = 0; -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ -/*N*/ nNumFormat = 0; // werden bei GetNumberFormat initialisiert -/*N*/ pAttrArray = 0; -/*N*/ nAttrEndRow = 0; -/*N*/ -/*N*/ return GetThis(rValue, rErr); -/*N*/ } - -/* ist inline: -BOOL ScValueIterator::GetNext(double& rValue, USHORT& rErr) -{ - ++nRow; - return GetThis(rValue, rErr); -} -*/ - -//------------------------------------------------------------------------ -//------------------------------------------------------------------------ - -/*N*/ ScQueryValueIterator::ScQueryValueIterator(ScDocument* pDocument, USHORT nTable, const ScQueryParam& rParam) : -/*N*/ pDoc( pDocument ), -/*N*/ nTab( nTable), -/*N*/ aParam (rParam), -/*N*/ nNumFmtType( NUMBERFORMAT_UNDEFINED ), -/*N*/ nNumFmtIndex(0), -/*N*/ bCalcAsShown( pDocument->GetDocOptions().IsCalcAsShown() ) -/*N*/ { -/*N*/ nCol = aParam.nCol1; -/*N*/ nRow = aParam.nRow1; -/*N*/ nColRow = 0; // wird bei GetFirst initialisiert -/*N*/ USHORT i; -/*N*/ USHORT nCount = aParam.GetEntryCount(); -/*N*/ for (i=0; (i<nCount) && (aParam.GetEntry(i).bDoQuery); i++) -/*N*/ { -/*N*/ ScQueryEntry& rEntry = aParam.GetEntry(i); -/*N*/ sal_uInt32 nIndex = 0; -/*N*/ rEntry.bQueryByString = -/*N*/ !(pDoc->GetFormatTable()->IsNumberFormat(*rEntry.pStr, nIndex, rEntry.nVal)); -/*N*/ } -/*N*/ nNumFormat = 0; // werden bei GetNumberFormat initialisiert -/*N*/ pAttrArray = 0; -/*N*/ nAttrEndRow = 0; -/*N*/ } -/*N*/ -/*N*/ BOOL ScQueryValueIterator::GetThis(double& rValue, USHORT& rErr) -/*N*/ { -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ USHORT nFirstQueryField = aParam.GetEntry(0).nField; -/*N*/ for ( ;; ) -/*N*/ { -/*N*/ if ( nRow > aParam.nRow2 ) -/*N*/ { -/*N*/ nRow = aParam.nRow1; -/*N*/ if (aParam.bHasHeader) -/*N*/ nRow++; -/*N*/ do -/*N*/ { -/*N*/ nCol++; -/*N*/ if ( nCol > aParam.nCol2 ) -/*N*/ { -/*N*/ rValue = 0.0; -/*N*/ rErr = 0; -/*N*/ return FALSE; // Ende und Aus -/*N*/ } -/*N*/ pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ } while ( pCol->nCount == 0 ); -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ } -/*N*/ -/*N*/ while ( (nColRow < pCol->nCount) && (pCol->pItems[nColRow].nRow < nRow) ) -/*N*/ nColRow++; -/*N*/ -/*N*/ if ( nColRow < pCol->nCount && pCol->pItems[nColRow].nRow <= aParam.nRow2 ) -/*N*/ { -/*N*/ nRow = pCol->pItems[nColRow].nRow; -/*N*/ ScBaseCell* pCell = pCol->pItems[nColRow].pCell; -/*N*/ if ( (pDoc->pTab[nTab])->ValidQuery( nRow, aParam, NULL, -/*N*/ (nCol == nFirstQueryField ? pCell : NULL) ) ) -/*N*/ { -/*N*/ switch (pCell->GetCellType()) -/*N*/ { -/*N*/ case CELLTYPE_VALUE: -/*N*/ { -/*N*/ rValue = ((ScValueCell*)pCell)->GetValue(); -/*N*/ if ( bCalcAsShown ) -/*N*/ { -/*N*/ #if ! ( defined WTC || defined ICC || defined HPUX || defined C50 || defined C52 || ( defined GCC && __GNUC__ >= 3 ) || ( defined WNT && _MSC_VER >= 1400 ) ) -/*N*/ lcl_IterGetNumberFormat( nNumFormat, pAttrArray, -/*N*/ #else -/*N*/ lcl_IterGetNumberFormat( nNumFormat, -/*N*/ (ScAttrArray const *&)pAttrArray, -/*N*/ #endif -/*N*/ nAttrEndRow, pCol->pAttrArray, nRow, pDoc ); -/*N*/ rValue = pDoc->RoundValueAsShown( rValue, nNumFormat ); -/*N*/ } -/*N*/ nNumFmtType = NUMBERFORMAT_NUMBER; -/*N*/ nNumFmtIndex = 0; -/*N*/ rErr = 0; -/*N*/ return TRUE; // gefunden -/*N*/ } -/*N*/ break; -/*N*/ case CELLTYPE_FORMULA: -/*N*/ { -/*N*/ if (((ScFormulaCell*)pCell)->IsValue()) -/*N*/ { -/*N*/ rValue = ((ScFormulaCell*)pCell)->GetValue(); -/*N*/ pDoc->GetNumberFormatInfo( nNumFmtType, -/*N*/ nNumFmtIndex, ScAddress( nCol, nRow, nTab ), -/*N*/ *((ScFormulaCell*)pCell) ); -/*N*/ rErr = ((ScFormulaCell*)pCell)->GetErrCode(); -/*N*/ return TRUE; // gefunden -/*N*/ } -/*N*/ else -/*N*/ nRow++; -/*N*/ } -/*N*/ break; -/*N*/ default: -/*N*/ nRow++; -/*N*/ break; -/*N*/ } -/*N*/ } -/*N*/ else -/*N*/ nRow++; -/*N*/ } -/*N*/ else -/*N*/ nRow = aParam.nRow2 + 1; // Naechste Spalte -/*N*/ } -/*N*/ return FALSE; -/*N*/ } -/*N*/ -/*N*/ BOOL ScQueryValueIterator::GetFirst(double& rValue, USHORT& rErr) -/*N*/ { -/*N*/ nCol = aParam.nCol1; -/*N*/ nRow = aParam.nRow1; -/*N*/ if (aParam.bHasHeader) -/*N*/ nRow++; -/*N*/ // nColRow = 0; -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ return GetThis(rValue, rErr); -/*N*/ } -/*N*/ -/*N*/ BOOL ScQueryValueIterator::GetNext(double& rValue, USHORT& rErr) -/*N*/ { -/*N*/ ++nRow; -/*N*/ return GetThis(rValue, rErr); -/*N*/ } - -//------------------------------------------------------------------------------- - -/*N*/ ScCellIterator::ScCellIterator( ScDocument* pDocument, -/*N*/ USHORT nSCol, USHORT nSRow, USHORT nSTab, -/*N*/ USHORT nECol, USHORT nERow, USHORT nETab, BOOL bSTotal ) : -/*N*/ pDoc( pDocument ), -/*N*/ nStartCol( nSCol), -/*N*/ nStartRow( nSRow), -/*N*/ nStartTab( nSTab ), -/*N*/ nEndCol( nECol ), -/*N*/ nEndRow( nERow), -/*N*/ nEndTab( nETab ), -/*N*/ bSubTotal(bSTotal) -/*N*/ -/*N*/ { -/*N*/ PutInOrder( nStartCol, nEndCol); -/*N*/ PutInOrder( nStartRow, nEndRow); -/*N*/ PutInOrder( nStartTab, nEndTab ); -/*N*/ -/*N*/ if (nStartCol > MAXCOL) nStartCol = MAXCOL; -/*N*/ if (nEndCol > MAXCOL) nEndCol = MAXCOL; -/*N*/ if (nStartRow > MAXROW) nStartRow = MAXROW; -/*N*/ if (nEndRow > MAXROW) nEndRow = MAXROW; -/*N*/ if (nStartTab > MAXTAB) nStartTab = MAXTAB; -/*N*/ if (nEndTab > MAXTAB) nEndTab = MAXTAB; -/*N*/ -/*N*/ while (nEndTab>0 && !pDoc->pTab[nEndTab]) -/*N*/ --nEndTab; // nur benutzte Tabellen -/*N*/ if (nStartTab>nEndTab) -/*N*/ nStartTab = nEndTab; -/*N*/ -/*N*/ nCol = nStartCol; -/*N*/ nRow = nStartRow; -/*N*/ nTab = nStartTab; -/*N*/ nColRow = 0; // wird bei GetFirst initialisiert -/*N*/ -/*N*/ if (!pDoc->pTab[nTab]) -/*N*/ { -/*N*/ DBG_ERROR("Tabelle nicht gefunden"); -/*N*/ nStartCol = nCol = MAXCOL+1; -/*N*/ nStartRow = nRow = MAXROW+1; -/*N*/ nStartTab = nTab = MAXTAB+1; // -> Abbruch bei GetFirst -/*N*/ } -/*N*/ } - -/*N*/ ScCellIterator::ScCellIterator -/*N*/ ( ScDocument* pDocument, const ScRange& rRange, BOOL bSTotal ) : -/*N*/ pDoc( pDocument ), -/*N*/ nStartCol( rRange.aStart.Col() ), -/*N*/ nStartRow( rRange.aStart.Row() ), -/*N*/ nStartTab( rRange.aStart.Tab() ), -/*N*/ nEndCol( rRange.aEnd.Col() ), -/*N*/ nEndRow( rRange.aEnd.Row() ), -/*N*/ nEndTab( rRange.aEnd.Tab() ), -/*N*/ bSubTotal(bSTotal) -/*N*/ -/*N*/ { -/*N*/ PutInOrder( nStartCol, nEndCol); -/*N*/ PutInOrder( nStartRow, nEndRow); -/*N*/ PutInOrder( nStartTab, nEndTab ); -/*N*/ -/*N*/ if (nStartCol > MAXCOL) nStartCol = MAXCOL; -/*N*/ if (nEndCol > MAXCOL) nEndCol = MAXCOL; -/*N*/ if (nStartRow > MAXROW) nStartRow = MAXROW; -/*N*/ if (nEndRow > MAXROW) nEndRow = MAXROW; -/*N*/ if (nStartTab > MAXTAB) nStartTab = MAXTAB; -/*N*/ if (nEndTab > MAXTAB) nEndTab = MAXTAB; -/*N*/ -/*N*/ while (nEndTab>0 && !pDoc->pTab[nEndTab]) -/*N*/ --nEndTab; // nur benutzte Tabellen -/*N*/ if (nStartTab>nEndTab) -/*N*/ nStartTab = nEndTab; -/*N*/ -/*N*/ nCol = nStartCol; -/*N*/ nRow = nStartRow; -/*N*/ nTab = nStartTab; -/*N*/ nColRow = 0; // wird bei GetFirst initialisiert -/*N*/ -/*N*/ if (!pDoc->pTab[nTab]) -/*N*/ { -/*N*/ DBG_ERROR("Tabelle nicht gefunden"); -/*N*/ nStartCol = nCol = MAXCOL+1; -/*N*/ nStartRow = nRow = MAXROW+1; -/*N*/ nStartTab = nTab = MAXTAB+1; // -> Abbruch bei GetFirst -/*N*/ } -/*N*/ } - -/*N*/ ScBaseCell* ScCellIterator::GetThis() -/*N*/ { -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ for ( ;; ) -/*N*/ { -/*N*/ if ( nRow > nEndRow ) -/*N*/ { -/*N*/ nRow = nStartRow; -/*N*/ do -/*N*/ { -/*N*/ nCol++; -/*N*/ if ( nCol > nEndCol ) -/*N*/ { -/*N*/ nCol = nStartCol; -/*N*/ nTab++; -/*N*/ if ( nTab > nEndTab ) -/*N*/ return NULL; // Ende und Aus -/*N*/ } -/*N*/ pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ } while ( pCol->nCount == 0 ); -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ } -/*N*/ -/*N*/ while ( (nColRow < pCol->nCount) && (pCol->pItems[nColRow].nRow < nRow) ) -/*N*/ nColRow++; -/*N*/ -/*N*/ if ( nColRow < pCol->nCount && pCol->pItems[nColRow].nRow <= nEndRow ) -/*N*/ { -/*N*/ nRow = pCol->pItems[nColRow].nRow; -/*N*/ if ( !bSubTotal || !pDoc->pTab[nTab]->IsFiltered( nRow ) ) -/*N*/ { -/*N*/ ScBaseCell* pCell = pCol->pItems[nColRow].pCell; -/*N*/ -/*N*/ if ( bSubTotal && pCell->GetCellType() == CELLTYPE_FORMULA -/*N*/ && ((ScFormulaCell*)pCell)->IsSubTotal() ) -/*N*/ nRow++; // Sub-Total-Zeilen nicht -/*N*/ else -/*N*/ return pCell; // gefunden -/*N*/ } -/*N*/ else -/*N*/ nRow++; -/*N*/ } -/*N*/ else -/*N*/ nRow = nEndRow + 1; // Naechste Spalte -/*N*/ } -/*N*/ } - -/*N*/ ScBaseCell* ScCellIterator::GetFirst() -/*N*/ { -/*N*/ if ( nTab > MAXTAB ) -/*N*/ return NULL; -/*N*/ nCol = nStartCol; -/*N*/ nRow = nStartRow; -/*N*/ nTab = nStartTab; -/*N*/ // nColRow = 0; -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ return GetThis(); -/*N*/ } - -/*N*/ ScBaseCell* ScCellIterator::GetNext() -/*N*/ { -/*N*/ ++nRow; -/*N*/ return GetThis(); -/*N*/ } - -//------------------------------------------------------------------------------- - -/*N*/ ScQueryCellIterator::ScQueryCellIterator(ScDocument* pDocument, USHORT nTable, -/*N*/ const ScQueryParam& rParam, BOOL bMod ) : -/*N*/ pDoc( pDocument ), -/*N*/ nTab( nTable), -/*N*/ aParam (rParam), -/*N*/ nStopOnMismatch( nStopOnMismatchDisabled ), -/*N*/ nTestEqualCondition( nTestEqualConditionDisabled ), -/*N*/ bAdvanceQuery( FALSE ) -/*N*/ { -/*N*/ nCol = aParam.nCol1; -/*N*/ nRow = aParam.nRow1; -/*N*/ nColRow = 0; // wird bei GetFirst initialisiert -/*N*/ USHORT i; -/*N*/ if (bMod) // sonst schon eingetragen -/*N*/ { -/*N*/ for (i=0; (i<MAXQUERY) && (aParam.GetEntry(i).bDoQuery); i++) -/*N*/ { -/*?*/ ScQueryEntry& rEntry = aParam.GetEntry(i); -/*?*/ sal_uInt32 nIndex = 0; -/*?*/ rEntry.bQueryByString = -/*?*/ !(pDoc->GetFormatTable()->IsNumberFormat(*rEntry.pStr, -/*?*/ nIndex, rEntry.nVal)); -/*N*/ } -/*N*/ } -/*N*/ nNumFormat = 0; // werden bei GetNumberFormat initialisiert -/*N*/ pAttrArray = 0; -/*N*/ nAttrEndRow = 0; -/*N*/ } -/*N*/ -/*N*/ ScBaseCell* ScQueryCellIterator::GetThis() -/*N*/ { -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ USHORT nFirstQueryField = aParam.GetEntry(0).nField; -/*N*/ for ( ;; ) -/*N*/ { -/*N*/ if ( nRow > aParam.nRow2 ) -/*N*/ { -/*N*/ nRow = aParam.nRow1; -/*N*/ if (aParam.bHasHeader) -/*?*/ nRow++; -/*N*/ do -/*M*/ { -/*M*/ if ( ++nCol > aParam.nCol2 ) -/*M*/ return NULL; // Ende und Aus -/*M*/ if ( bAdvanceQuery ) -/*M*/ { -/*M*/ AdvanceQueryParamEntryField(); -/*M*/ nFirstQueryField = aParam.GetEntry(0).nField; -/*M*/ } -/*M*/ pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*M*/ } while ( pCol->nCount == 0 ); -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ } -/*N*/ -/*N*/ while ( nColRow < pCol->nCount && pCol->pItems[nColRow].nRow < nRow ) -/*N*/ nColRow++; -/*N*/ -/*N*/ if ( nColRow < pCol->nCount && pCol->pItems[nColRow].nRow <= aParam.nRow2 ) -/*N*/ { -/*N*/ if ( pCol->pItems[nColRow].pCell->GetCellType() == CELLTYPE_NOTE ) -/*?*/ nRow++; -/*N*/ else -/*N*/ { -/*N*/ BOOL bTestEqualCondition; -/*N*/ nRow = pCol->pItems[nColRow].nRow; -/*N*/ ScBaseCell* pCell = pCol->pItems[nColRow].pCell; -/*N*/ if ( (pDoc->pTab[nTab])->ValidQuery( nRow, aParam, NULL, -/*N*/ (nCol == nFirstQueryField ? pCell : NULL), -/*N*/ (nTestEqualCondition ? &bTestEqualCondition : NULL) ) ) -/*N*/ { -/*N*/ if ( nTestEqualCondition && bTestEqualCondition ) -/*N*/ nTestEqualCondition |= nTestEqualConditionMatched; -/*N*/ return pCell; // found -/*N*/ } -/*N*/ else if ( nStopOnMismatch ) -/*N*/ { -/*N*/ nStopOnMismatch |= nStopOnMismatchOccured; -/*N*/ // Yes, even a mismatch may have a fulfilled equal -/*N*/ // condition if regular expressions were involved and -/*N*/ // SC_LESS_EQUAL or SC_GREATER_EQUAL were queried. -/*N*/ if ( nTestEqualCondition && bTestEqualCondition ) -/*?*/ nTestEqualCondition |= nTestEqualConditionMatched; -/*N*/ return NULL; -/*N*/ } -/*N*/ else -/*N*/ nRow++; -/*N*/ } -/*N*/ } -/*N*/ else -/*?*/ nRow = aParam.nRow2 + 1; // Naechste Spalte -/*N*/ } -/*N*/ } -/*N*/ -/*N*/ ScBaseCell* ScQueryCellIterator::GetFirst() -/*N*/ { -/*N*/ nCol = aParam.nCol1; -/*N*/ nRow = aParam.nRow1; -/*N*/ if (aParam.bHasHeader) -/*?*/ nRow++; -/*N*/ // nColRow = 0; -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ pCol->Search( nRow, nColRow ); -/*N*/ return GetThis(); -/*N*/ } -/*N*/ -/*N*/ ScBaseCell* ScQueryCellIterator::GetNext() -/*N*/ { -/*N*/ ++nRow; -/*N*/ if ( nStopOnMismatch ) -/*N*/ nStopOnMismatch = nStopOnMismatchEnabled; -/*N*/ if ( nTestEqualCondition ) -/*N*/ nTestEqualCondition = nTestEqualConditionEnabled; -/*N*/ return GetThis(); -/*N*/ } -/*N*/ -/*N*/ ULONG ScQueryCellIterator::GetNumberFormat() -/*N*/ { -/*N*/ ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; -/*N*/ #if ! ( defined WTC || defined ICC || defined HPUX || defined C50 || defined C52 || ( defined GCC && __GNUC__ >= 3 ) || ( defined WNT && _MSC_VER >= 1400 ) ) -/*N*/ lcl_IterGetNumberFormat( nNumFormat, pAttrArray, -/*N*/ #else -/*N*/ lcl_IterGetNumberFormat( nNumFormat, -/*N*/ (ScAttrArray const *&)pAttrArray, -/*N*/ #endif -/*N*/ nAttrEndRow, pCol->pAttrArray, nRow, pDoc ); -/*N*/ return nNumFormat; -/*N*/ } - -/*N*/ void ScQueryCellIterator::AdvanceQueryParamEntryField() -/*N*/ { -/*N*/ USHORT nEntries = aParam.GetEntryCount(); -/*N*/ for ( USHORT j = 0; j < nEntries; j++ ) -/*N*/ { -/*N*/ ScQueryEntry& rEntry = aParam.GetEntry( j ); -/*N*/ if ( rEntry.bDoQuery ) -/*N*/ { -/*N*/ if ( rEntry.nField < MAXCOL ) -/*N*/ rEntry.nField++; -/*N*/ else -/*N*/ { -/*N*/ DBG_ERRORFILE( "AdvanceQueryParamEntryField: ++rEntry.nField > MAXCOL" ); -/*N*/ } -/*N*/ } -/*N*/ else -/*N*/ break; // for -/*N*/ } -/*N*/ } - - -/*N*/ BOOL ScQueryCellIterator::FindEqualOrSortedLastInRange( USHORT& nFoundCol, USHORT& nFoundRow ) -/*N*/ { -/*N*/ nFoundCol = MAXCOL+1; -/*N*/ nFoundRow = MAXROW+1; -/*N*/ SetStopOnMismatch( TRUE ); // assume sorted keys -/*N*/ SetTestEqualCondition( TRUE ); -/*N*/ if ( GetFirst() ) -/*N*/ { -/*N*/ do -/*N*/ { -/*N*/ nFoundCol = GetCol(); -/*N*/ nFoundRow = GetRow(); -/*N*/ } while ( !IsEqualConditionFulfilled() && GetNext() ); -/*N*/ } -/*N*/ if ( IsEqualConditionFulfilled() ) -/*N*/ { -/*N*/ nFoundCol = GetCol(); -/*N*/ nFoundRow = GetRow(); -/*N*/ return TRUE; -/*N*/ } -/*N*/ if ( StoppedOnMismatch() ) -/*N*/ { // Assume found entry to be the last value less than or equal to query. -/*N*/ // But keep on searching for an equal match. -/*N*/ SetStopOnMismatch( FALSE ); -/*N*/ SetTestEqualCondition( FALSE ); -/*N*/ USHORT nEntries = aParam.GetEntryCount(); -/*N*/ for ( USHORT j = 0; j < nEntries; j++ ) -/*N*/ { -/*N*/ ScQueryEntry& rEntry = aParam.GetEntry( j ); -/*N*/ if ( rEntry.bDoQuery ) -/*N*/ { -/*N*/ switch ( rEntry.eOp ) -/*N*/ { -/*N*/ case SC_LESS_EQUAL : -/*N*/ case SC_GREATER_EQUAL : -/*N*/ rEntry.eOp = SC_EQUAL; -/*N*/ break; -/*N*/ } -/*N*/ } -/*N*/ else -/*N*/ break; // for -/*N*/ } -/*N*/ if ( GetNext() ) -/*N*/ { -/*?*/ nFoundCol = GetCol(); -/*?*/ nFoundRow = GetRow(); -/*N*/ } -/*N*/ } -/*N*/ return (nFoundCol <= MAXCOL) && (nFoundRow <= MAXROW); -/*N*/ } - - -//------------------------------------------------------------------------------- - -/*N*/ ScHorizontalCellIterator::ScHorizontalCellIterator(ScDocument* pDocument, USHORT nTable, -/*N*/ USHORT nCol1, USHORT nRow1, USHORT nCol2, USHORT nRow2 ) : -/*N*/ pDoc( pDocument ), -/*N*/ nTab( nTable ), -/*N*/ nStartCol( nCol1 ), -/*N*/ nEndCol( nCol2 ), -/*N*/ nEndRow( nRow2 ), -/*N*/ nCol( nCol1 ), -/*N*/ nRow( nRow1 ), -/*N*/ bMore( TRUE ) -/*N*/ { -/*N*/ USHORT i; -/*N*/ USHORT nIndex; -/*N*/ -/*N*/ pNextRows = new USHORT[ nCol2-nCol1+1 ]; -/*N*/ pNextIndices = new USHORT[ nCol2-nCol1+1 ]; -/*N*/ -/*N*/ for (i=nStartCol; i<=nEndCol; i++) -/*N*/ { -/*N*/ ScColumn* pCol = &pDoc->pTab[nTab]->aCol[i]; -/*N*/ -/*N*/ pCol->Search( nRow1, nIndex ); -/*N*/ if ( nIndex < pCol->nCount ) -/*N*/ { -/*N*/ pNextRows[i-nStartCol] = pCol->pItems[nIndex].nRow; -/*N*/ pNextIndices[i-nStartCol] = nIndex; -/*N*/ } -/*N*/ else -/*N*/ { -/*N*/ pNextRows[i-nStartCol] = MAXROW+1; // nichts gefunden -/*N*/ pNextIndices[i-nStartCol] = MAXROW+1; -/*N*/ } -/*N*/ } -/*N*/ -/*N*/ if (pNextRows[0] != nRow1) -/*N*/ Advance(); -/*N*/ } - -/*N*/ ScHorizontalCellIterator::~ScHorizontalCellIterator() -/*N*/ { -/*N*/ delete [] pNextRows; -/*N*/ delete [] pNextIndices; -/*N*/ } - -/*N*/ ScBaseCell* ScHorizontalCellIterator::GetNext( USHORT& rCol, USHORT& rRow ) -/*N*/ { -/*N*/ if ( bMore ) -/*N*/ { -/*N*/ rCol = nCol; -/*N*/ rRow = nRow; -/*N*/ -/*N*/ ScColumn* pCol = &pDoc->pTab[nTab]->aCol[nCol]; -/*N*/ USHORT nIndex = pNextIndices[nCol-nStartCol]; -/*N*/ DBG_ASSERT( nIndex < pCol->nCount, "ScHorizontalCellIterator::GetNext: nIndex out of range" ); -/*N*/ ScBaseCell* pCell = pCol->pItems[nIndex].pCell; -/*N*/ if ( ++nIndex < pCol->nCount ) -/*N*/ { -/*N*/ pNextRows[nCol-nStartCol] = pCol->pItems[nIndex].nRow; -/*N*/ pNextIndices[nCol-nStartCol] = nIndex; -/*N*/ } -/*N*/ else -/*N*/ { -/*N*/ pNextRows[nCol-nStartCol] = MAXROW+1; // nichts gefunden -/*N*/ pNextIndices[nCol-nStartCol] = MAXROW+1; -/*N*/ } -/*N*/ -/*N*/ Advance(); -/*N*/ return pCell; -/*N*/ } -/*N*/ else -/*N*/ return NULL; -/*N*/ } - -/*N*/ BOOL ScHorizontalCellIterator::ReturnNext( USHORT& rCol, USHORT& rRow ) -/*N*/ { -/*N*/ rCol = nCol; -/*N*/ rRow = nRow; -/*N*/ return bMore; -/*N*/ } - -/*N*/ void ScHorizontalCellIterator::Advance() -/*N*/ { -/*N*/ BOOL bFound = FALSE; -/*N*/ USHORT i; -/*N*/ -/*N*/ for (i=nCol+1; i<=nEndCol && !bFound; i++) -/*N*/ if (pNextRows[i-nStartCol] == nRow) -/*N*/ { -/*N*/ nCol = i; -/*N*/ bFound = TRUE; -/*N*/ } -/*N*/ -/*N*/ if (!bFound) -/*N*/ { -/*N*/ USHORT nMinRow = MAXROW+1; -/*N*/ for (i=nStartCol; i<=nEndCol; i++) -/*N*/ if (pNextRows[i-nStartCol] < nMinRow) -/*N*/ { -/*N*/ nCol = i; -/*N*/ nMinRow = pNextRows[i-nStartCol]; -/*N*/ } -/*N*/ -/*N*/ if (nMinRow <= nEndRow) -/*N*/ { -/*N*/ nRow = nMinRow; -/*N*/ bFound = TRUE; -/*N*/ } -/*N*/ } -/*N*/ -/*N*/ if ( !bFound ) -/*N*/ bMore = FALSE; -/*N*/ } - -//------------------------------------------------------------------------------- - - -//------------------------------------------------------------------------------- - - -//------------------------------------------------------------------------------- - -/*N*/ ScDocAttrIterator::ScDocAttrIterator(ScDocument* pDocument, USHORT nTable, -/*N*/ USHORT nCol1, USHORT nRow1, -/*N*/ USHORT nCol2, USHORT nRow2) : -/*N*/ pDoc( pDocument ), -/*N*/ nTab( nTable ), -/*N*/ nCol( nCol1 ), -/*N*/ nEndCol( nCol2 ), -/*N*/ nStartRow( nRow1 ), -/*N*/ nEndRow( nRow2 ) -/*N*/ { -/*N*/ if ( nTab<=MAXTAB && pDoc->pTab[nTab] ) -/*N*/ pColIter = pDoc->pTab[nTab]->aCol[nCol].CreateAttrIterator( nStartRow, nEndRow ); -/*N*/ else -/*N*/ pColIter = NULL; -/*N*/ } - -/*N*/ ScDocAttrIterator::~ScDocAttrIterator() -/*N*/ { -/*N*/ delete pColIter; -/*N*/ } - -/*N*/ const ScPatternAttr* ScDocAttrIterator::GetNext( USHORT& rCol, USHORT& rRow1, USHORT& rRow2 ) -/*N*/ { -/*N*/ while ( pColIter ) -/*N*/ { -/*N*/ const ScPatternAttr* pPattern = pColIter->Next( rRow1, rRow2 ); -/*N*/ if ( pPattern ) -/*N*/ { -/*N*/ rCol = nCol; -/*N*/ return pPattern; -/*N*/ } -/*N*/ -/*N*/ delete pColIter; -/*N*/ ++nCol; -/*N*/ if ( nCol <= nEndCol ) -/*N*/ pColIter = pDoc->pTab[nTab]->aCol[nCol].CreateAttrIterator( nStartRow, nEndRow ); -/*N*/ else -/*N*/ pColIter = NULL; -/*N*/ } -/*N*/ return NULL; // is nix mehr -/*N*/ } - -//------------------------------------------------------------------------------- - -/*N*/ ScAttrRectIterator::ScAttrRectIterator(ScDocument* pDocument, USHORT nTable, -/*N*/ USHORT nCol1, USHORT nRow1, -/*N*/ USHORT nCol2, USHORT nRow2) : -/*N*/ pDoc( pDocument ), -/*N*/ nTab( nTable ), -/*N*/ nEndCol( nCol2 ), -/*N*/ nStartRow( nRow1 ), -/*N*/ nEndRow( nRow2 ), -/*N*/ nIterStartCol( nCol1 ), -/*N*/ nIterEndCol( nCol1 ) -/*N*/ { -/*N*/ if ( nTab<=MAXTAB && pDoc->pTab[nTab] ) -/*N*/ { -/*N*/ pColIter = pDoc->pTab[nTab]->aCol[nIterStartCol].CreateAttrIterator( nStartRow, nEndRow ); -/*N*/ while ( nIterEndCol < nEndCol && -/*N*/ pDoc->pTab[nTab]->aCol[nIterEndCol].IsAllAttrEqual( -/*N*/ pDoc->pTab[nTab]->aCol[nIterEndCol+1], nStartRow, nEndRow ) ) -/*N*/ ++nIterEndCol; -/*N*/ } -/*N*/ else -/*N*/ pColIter = NULL; -/*N*/ } - -/*N*/ ScAttrRectIterator::~ScAttrRectIterator() -/*N*/ { -/*N*/ delete pColIter; -/*N*/ } - -/*N*/ void ScAttrRectIterator::DataChanged() -/*N*/ { -/*N*/ if (pColIter) -/*N*/ { -/*N*/ USHORT nNextRow = pColIter->GetNextRow(); -/*N*/ delete pColIter; -/*N*/ pColIter = pDoc->pTab[nTab]->aCol[nIterStartCol].CreateAttrIterator( nNextRow, nEndRow ); -/*N*/ } -/*N*/ } - -/*N*/ const ScPatternAttr* ScAttrRectIterator::GetNext( USHORT& rCol1, USHORT& rCol2, -/*N*/ USHORT& rRow1, USHORT& rRow2 ) -/*N*/ { -/*N*/ while ( pColIter ) -/*N*/ { -/*N*/ const ScPatternAttr* pPattern = pColIter->Next( rRow1, rRow2 ); -/*N*/ if ( pPattern ) -/*N*/ { -/*N*/ rCol1 = nIterStartCol; -/*N*/ rCol2 = nIterEndCol; -/*N*/ return pPattern; -/*N*/ } -/*N*/ -/*N*/ delete pColIter; -/*N*/ nIterStartCol = nIterEndCol+1; -/*N*/ if ( nIterStartCol <= nEndCol ) -/*N*/ { -/*N*/ nIterEndCol = nIterStartCol; -/*N*/ pColIter = pDoc->pTab[nTab]->aCol[nIterStartCol].CreateAttrIterator( nStartRow, nEndRow ); -/*N*/ while ( nIterEndCol < nEndCol && -/*N*/ pDoc->pTab[nTab]->aCol[nIterEndCol].IsAllAttrEqual( -/*N*/ pDoc->pTab[nTab]->aCol[nIterEndCol+1], nStartRow, nEndRow ) ) -/*N*/ ++nIterEndCol; -/*N*/ } -/*N*/ else -/*N*/ pColIter = NULL; -/*N*/ } -/*N*/ return NULL; // is nix mehr -/*N*/ } - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |