diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-03-22 14:21:25 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2013-03-22 21:49:25 -0400 |
commit | 98c408356cffbf48fad596168399143e17321555 (patch) | |
tree | 33cadb7b0f238923f975cbf8f544e85b762b473b | |
parent | 73f66a092c16cf96f87cae14442cef8d8fd3a0ae (diff) |
Use ScCellValue instead of ScBaseCell in ScCellIterator.
But of course such migration has to be done in gradual steps. For now,
ScCellIterator supports both methods.
Change-Id: I40cd8969b05598fe20916e43a5537217e824d418
-rw-r--r-- | sc/Library_sc.mk | 3 | ||||
-rw-r--r-- | sc/inc/cell.hxx | 12 | ||||
-rw-r--r-- | sc/inc/dociter.hxx | 8 | ||||
-rw-r--r-- | sc/inc/formulaiter.hxx | 45 | ||||
-rw-r--r-- | sc/source/core/data/cell.cxx | 57 | ||||
-rw-r--r-- | sc/source/core/data/dociter.cxx | 107 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 1 | ||||
-rw-r--r-- | sc/source/core/data/formulaiter.cxx | 80 | ||||
-rw-r--r-- | sc/source/core/tool/detfunc.cxx | 1 | ||||
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleCell.cxx | 36 | ||||
-rw-r--r-- | sc/source/ui/app/transobj.cxx | 1 | ||||
-rw-r--r-- | sc/source/ui/docshell/tablink.cxx | 1 | ||||
-rw-r--r-- | sc/source/ui/unoobj/cellsuno.cxx | 1 |
13 files changed, 262 insertions, 91 deletions
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk index 1935b7afb528..2ee7004024f6 100644 --- a/sc/Library_sc.mk +++ b/sc/Library_sc.mk @@ -143,7 +143,8 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ sc/source/core/data/drawpage \ sc/source/core/data/drwlayer \ sc/source/core/data/fillinfo \ - sc/source/core/data/funcdesc \ + sc/source/core/data/formulaiter \ + sc/source/core/data/funcdesc \ sc/source/core/data/global \ sc/source/core/data/global2 \ sc/source/core/data/globalx \ diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx index 4230272c793c..0d3469893625 100644 --- a/sc/inc/cell.hxx +++ b/sc/inc/cell.hxx @@ -602,18 +602,6 @@ public: bool InterpretFormulaGroup(); }; -// Iterator for references in a formula cell -class ScDetectiveRefIter -{ -private: - ScTokenArray* pCode; - ScAddress aPos; -public: - ScDetectiveRefIter( ScFormulaCell* pCell ); - bool GetNextRef( ScRange& rRange ); - ScToken* GetNextRefToken(); -}; - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx index c104a33a8186..80f3738abc91 100644 --- a/sc/inc/dociter.hxx +++ b/sc/inc/dociter.hxx @@ -24,6 +24,7 @@ #include <tools/solar.h> #include "global.hxx" #include "scdllapi.h" +#include "cellvalue.hxx" #include <memory> @@ -217,11 +218,13 @@ private: ScAddress maStartPos; ScAddress maEndPos; ScAddress maCurPos; + ScCellValue maCurCell; SCSIZE nColRow; bool bSubTotal; ScBaseCell* GetThis(); void init(); + bool getCurrent(); public: ScCellIterator(ScDocument* pDocument, SCCOL nSCol, SCROW nSRow, SCTAB nSTab, @@ -232,6 +235,11 @@ public: ScBaseCell* GetFirst(); ScBaseCell* GetNext(); const ScAddress& GetPos() const { return maCurPos; } + + bool first(); + bool next(); + + const ScCellValue& get() const; }; class ScQueryCellIterator // walk through all non-empty cells in an area diff --git a/sc/inc/formulaiter.hxx b/sc/inc/formulaiter.hxx new file mode 100644 index 000000000000..dbde7e1b49ec --- /dev/null +++ b/sc/inc/formulaiter.hxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef SC_FORMULAITER_HXX +#define SC_FORMULAITER_HXX + +#include "address.hxx" + +class ScTokenArray; +class ScFormulaCell; +class ScToken; + +/** + * Iterator for references in a formula cell. + */ +class ScDetectiveRefIter +{ +private: + ScTokenArray* pCode; + ScAddress aPos; +public: + ScDetectiveRefIter( ScFormulaCell* pCell ); + bool GetNextRef( ScRange& rRange ); + ScToken* GetNextRefToken(); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx index 4aac6b5179b3..aa777e58d830 100644 --- a/sc/source/core/data/cell.cxx +++ b/sc/source/core/data/cell.cxx @@ -1980,61 +1980,4 @@ EditTextObject* ScFormulaCell::CreateURLObject() return CreateURLObjectFromURL( *pDocument, aURL, aCellText ); } -// ============================================================================ - -ScDetectiveRefIter::ScDetectiveRefIter( ScFormulaCell* pCell ) -{ - pCode = pCell->GetCode(); - pCode->Reset(); - aPos = pCell->aPos; -} - -static bool lcl_ScDetectiveRefIter_SkipRef( ScToken* p ) -{ - ScSingleRefData& rRef1 = p->GetSingleRef(); - if ( rRef1.IsColDeleted() || rRef1.IsRowDeleted() || rRef1.IsTabDeleted() - || !rRef1.Valid() ) - return true; - if ( p->GetType() == svDoubleRef || p->GetType() == svExternalDoubleRef ) - { - ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; - if ( rRef2.IsColDeleted() || rRef2.IsRowDeleted() || rRef2.IsTabDeleted() - || !rRef2.Valid() ) - return true; - } - return false; -} - -bool ScDetectiveRefIter::GetNextRef( ScRange& rRange ) -{ - bool bRet = false; - ScToken* p = GetNextRefToken(); - if( p ) - { - SingleDoubleRefProvider aProv( *p ); - rRange.aStart.Set( aProv.Ref1.nCol, aProv.Ref1.nRow, aProv.Ref1.nTab ); - rRange.aEnd.Set( aProv.Ref2.nCol, aProv.Ref2.nRow, aProv.Ref2.nTab ); - bRet = true; - } - - return bRet; -} - -ScToken* ScDetectiveRefIter::GetNextRefToken() -{ - ScToken* p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); - if (p) - p->CalcAbsIfRel( aPos ); - - while ( p && lcl_ScDetectiveRefIter_SkipRef( p ) ) - { - p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); - if (p) - p->CalcAbsIfRel( aPos ); - } - return p; -} - -// ============================================================================ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index d5417d5cb5ed..5446bbc09d3f 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -36,12 +36,12 @@ #include "queryentry.hxx" #include "globstr.hrc" #include "tools/fract.hxx" +#include "editeng/editobj.hxx" #include <vector> using ::rtl::math::approxEqual; using ::std::vector; -using ::rtl::OUString; using ::std::set; // STATIC DATA ----------------------------------------------------------- @@ -1051,6 +1051,111 @@ ScBaseCell* ScCellIterator::GetNext() return GetThis(); } +bool ScCellIterator::getCurrent() +{ + ScColumn* pCol = &(pDoc->maTabs[maCurPos.Tab()])->aCol[maCurPos.Col()]; + while (true) + { + if (maCurPos.Row() > maEndPos.Row()) + { + maCurPos.SetRow(maStartPos.Row()); + do + { + maCurPos.IncCol(); + if (maCurPos.Col() > maEndPos.Col()) + { + maCurPos.SetCol(maStartPos.Col()); + maCurPos.IncTab(); + if (maCurPos.Tab() > maEndPos.Tab()) + { + maCurCell.clear(); + return false; // Over and out + } + } + pCol = &(pDoc->maTabs[maCurPos.Tab()])->aCol[maCurPos.Col()]; + } while ( pCol->maItems.empty() ); + pCol->Search(maCurPos.Row(), nColRow); + } + + while ( (nColRow < pCol->maItems.size()) && (pCol->maItems[nColRow].nRow < maCurPos.Row()) ) + ++nColRow; + + if (nColRow < pCol->maItems.size() && pCol->maItems[nColRow].nRow <= maEndPos.Row()) + { + maCurPos.SetRow(pCol->maItems[nColRow].nRow); + if (!bSubTotal || !pDoc->maTabs[maCurPos.Tab()]->RowFiltered(maCurPos.Row())) + { + ScBaseCell* pCell = pCol->maItems[nColRow].pCell; + + if ( bSubTotal && pCell->GetCellType() == CELLTYPE_FORMULA + && ((ScFormulaCell*)pCell)->IsSubTotal() ) + maCurPos.IncRow(); // Don't subtotal rows + else + { + // Found it! + maCurCell.clear(); + maCurCell.meType = pCell->GetCellType(); + switch (maCurCell.meType) + { + case CELLTYPE_VALUE: + maCurCell.mfValue = static_cast<const ScValueCell*>(pCell)->GetValue(); + break; + case CELLTYPE_STRING: + { + const OUString& rStr = static_cast<const ScStringCell*>(pCell)->GetString(); + maCurCell.mpString = new OUString(rStr); + } + break; + case CELLTYPE_EDIT: + { + const EditTextObject* pData = static_cast<const ScEditCell*>(pCell)->GetData(); + maCurCell.mpEditText = pData->Clone(); + } + break; + case CELLTYPE_FORMULA: + maCurCell.mpFormula = static_cast<const ScFormulaCell*>(pCell)->Clone(); + break; + default: + maCurCell.meType = CELLTYPE_NONE; + } + + if (maCurCell.meType != CELLTYPE_NONE) + return true; + + maCurPos.IncRow(); + } + } + else + maCurPos.IncRow(); + } + else + maCurPos.SetRow(maEndPos.Row() + 1); // Next column + } + return false; +} + +bool ScCellIterator::first() +{ + if (!ValidTab(maCurPos.Tab())) + return false; + + maCurPos = maStartPos; + ScColumn* pCol = &(pDoc->maTabs[maCurPos.Tab()])->aCol[maCurPos.Col()]; + pCol->Search(maCurPos.Row(), nColRow); + return getCurrent(); +} + +bool ScCellIterator::next() +{ + maCurPos.IncRow(); + return getCurrent(); +} + +const ScCellValue& ScCellIterator::get() const +{ + return maCurCell; +} + //------------------------------------------------------------------------------- ScQueryCellIterator::ScQueryCellIterator(ScDocument* pDocument, SCTAB nTable, diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index dcdb2abc35d6..a0ec2342cfa2 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -88,6 +88,7 @@ #include "defaultsoptions.hxx" #include "editutil.hxx" #include "stringutil.hxx" +#include "formulaiter.hxx" #include <map> #include <limits> diff --git a/sc/source/core/data/formulaiter.cxx b/sc/source/core/data/formulaiter.cxx new file mode 100644 index 000000000000..4a28acf2156d --- /dev/null +++ b/sc/source/core/data/formulaiter.cxx @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 . + */ + +#include "formulaiter.hxx" + +#include "cell.hxx" +#include "formula/token.hxx" + +using namespace formula; + +ScDetectiveRefIter::ScDetectiveRefIter( ScFormulaCell* pCell ) +{ + pCode = pCell->GetCode(); + pCode->Reset(); + aPos = pCell->aPos; +} + +static bool lcl_ScDetectiveRefIter_SkipRef( ScToken* p ) +{ + ScSingleRefData& rRef1 = p->GetSingleRef(); + if ( rRef1.IsColDeleted() || rRef1.IsRowDeleted() || rRef1.IsTabDeleted() + || !rRef1.Valid() ) + return true; + if ( p->GetType() == svDoubleRef || p->GetType() == svExternalDoubleRef ) + { + ScSingleRefData& rRef2 = p->GetDoubleRef().Ref2; + if ( rRef2.IsColDeleted() || rRef2.IsRowDeleted() || rRef2.IsTabDeleted() + || !rRef2.Valid() ) + return true; + } + return false; +} + +bool ScDetectiveRefIter::GetNextRef( ScRange& rRange ) +{ + bool bRet = false; + ScToken* p = GetNextRefToken(); + if( p ) + { + SingleDoubleRefProvider aProv( *p ); + rRange.aStart.Set( aProv.Ref1.nCol, aProv.Ref1.nRow, aProv.Ref1.nTab ); + rRange.aEnd.Set( aProv.Ref2.nCol, aProv.Ref2.nRow, aProv.Ref2.nTab ); + bRet = true; + } + + return bRet; +} + +ScToken* ScDetectiveRefIter::GetNextRefToken() +{ + ScToken* p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); + if (p) + p->CalcAbsIfRel( aPos ); + + while ( p && lcl_ScDetectiveRefIter_SkipRef( p ) ) + { + p = static_cast<ScToken*>(pCode->GetNextReferenceRPN()); + if (p) + p->CalcAbsIfRel( aPos ); + } + return p; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/tool/detfunc.cxx b/sc/source/core/tool/detfunc.cxx index 359e95eac13e..57981eccabd4 100644 --- a/sc/source/core/tool/detfunc.cxx +++ b/sc/source/core/tool/detfunc.cxx @@ -66,6 +66,7 @@ #include "postit.hxx" #include "rangelst.hxx" #include "reftokenhelper.hxx" +#include "formulaiter.hxx" #include <vector> diff --git a/sc/source/ui/Accessibility/AccessibleCell.cxx b/sc/source/ui/Accessibility/AccessibleCell.cxx index 95ac6ebb2ce2..33a99a1c2826 100644 --- a/sc/source/ui/Accessibility/AccessibleCell.cxx +++ b/sc/source/ui/Accessibility/AccessibleCell.cxx @@ -30,8 +30,9 @@ #include "miscuno.hxx" #include "editsrc.hxx" #include "dociter.hxx" -#include "cell.hxx" #include "markdata.hxx" +#include "cellvalue.hxx" +#include "formulaiter.hxx" #include <unotools/accessiblestatesethelper.hxx> #include <com/sun/star/accessibility/AccessibleRole.hpp> @@ -361,43 +362,38 @@ void ScAccessibleCell::FillDependends(utl::AccessibleRelationSetHelper* pRelatio { if (mpDoc) { - ScCellIterator aCellIter( mpDoc, 0,0, maCellAddress.Tab(), MAXCOL,MAXROW, maCellAddress.Tab() ); - ScBaseCell* pCell = aCellIter.GetFirst(); - while (pCell) + ScRange aRange(0, 0, maCellAddress.Tab(), MAXCOL, MAXROW, maCellAddress.Tab()); + ScCellIterator aCellIter(mpDoc, aRange); + + for (bool bHasCell = aCellIter.first(); bHasCell; bHasCell = aCellIter.next()) { - if (pCell->GetCellType() == CELLTYPE_FORMULA) + const ScCellValue& rVal = aCellIter.get(); + if (rVal.meType == CELLTYPE_FORMULA) { - sal_Bool bFound(false); - ScDetectiveRefIter aIter( (ScFormulaCell*) pCell ); + bool bFound = false; + ScDetectiveRefIter aIter(rVal.mpFormula); ScRange aRef; while ( !bFound && aIter.GetNextRef( aRef ) ) { if (aRef.In(maCellAddress)) - bFound = sal_True; + bFound = true; } if (bFound) AddRelation(aCellIter.GetPos(), AccessibleRelationType::CONTROLLER_FOR, pRelationSet); } - pCell = aCellIter.GetNext(); } } } void ScAccessibleCell::FillPrecedents(utl::AccessibleRelationSetHelper* pRelationSet) { - if (mpDoc) + if (mpDoc && mpDoc->GetCellType(maCellAddress) == CELLTYPE_FORMULA) { - ScBaseCell* pBaseCell = mpDoc->GetCell(maCellAddress); - if (pBaseCell && (pBaseCell->GetCellType() == CELLTYPE_FORMULA)) + ScDetectiveRefIter aIter(mpDoc->GetFormulaCell(maCellAddress)); + ScRange aRef; + while ( aIter.GetNextRef( aRef ) ) { - ScFormulaCell* pFCell = (ScFormulaCell*) pBaseCell; - - ScDetectiveRefIter aIter( pFCell ); - ScRange aRef; - while ( aIter.GetNextRef( aRef ) ) - { - AddRelation( aRef, AccessibleRelationType::CONTROLLED_BY, pRelationSet); - } + AddRelation( aRef, AccessibleRelationType::CONTROLLED_BY, pRelationSet); } } } diff --git a/sc/source/ui/app/transobj.cxx b/sc/source/ui/app/transobj.cxx index 71046f43acb2..b98c05527b2a 100644 --- a/sc/source/ui/app/transobj.cxx +++ b/sc/source/ui/app/transobj.cxx @@ -62,6 +62,7 @@ #include "dociter.hxx" #include "cellsuno.hxx" #include "stringutil.hxx" +#include "formulaiter.hxx" using namespace com::sun::star; diff --git a/sc/source/ui/docshell/tablink.cxx b/sc/source/ui/docshell/tablink.cxx index a16f51ba1279..9105ee293886 100644 --- a/sc/source/ui/docshell/tablink.cxx +++ b/sc/source/ui/docshell/tablink.cxx @@ -42,6 +42,7 @@ #include "dociter.hxx" #include "formula/opcode.hxx" #include "cell.hxx" +#include "formulaiter.hxx" using ::rtl::OUString; diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx index 4ee76daf2582..a64feb1a448f 100644 --- a/sc/source/ui/unoobj/cellsuno.cxx +++ b/sc/source/ui/unoobj/cellsuno.cxx @@ -120,6 +120,7 @@ #include "formula/grammar.hxx" #include "editeng/escapementitem.hxx" #include "stringutil.hxx" +#include "formulaiter.hxx" #include <list> #include <boost/scoped_ptr.hpp> |