1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #include <formulaiter.hxx> 21 22 #include <formulacell.hxx> 23 #include <tokenarray.hxx> 24 #include <formula/token.hxx> 25 #include <token.hxx> 26 27 using namespace formula; 28 ScDetectiveRefIter(ScFormulaCell * pCell)29ScDetectiveRefIter::ScDetectiveRefIter( ScFormulaCell* pCell ) : 30 maIter(*pCell->GetCode()), 31 aPos(pCell->aPos) 32 { 33 } 34 lcl_ScDetectiveRefIter_SkipRef(formula::FormulaToken * p,const ScAddress & rPos)35static bool lcl_ScDetectiveRefIter_SkipRef( formula::FormulaToken* p, const ScAddress& rPos ) 36 { 37 ScSingleRefData& rRef1 = *p->GetSingleRef(); 38 ScAddress aAbs1 = rRef1.toAbs(rPos); 39 if (!ValidAddress(aAbs1)) 40 return true; 41 if ( p->GetType() == svDoubleRef || p->GetType() == svExternalDoubleRef ) 42 { 43 ScSingleRefData& rRef2 = p->GetDoubleRef()->Ref2; 44 ScAddress aAbs2 = rRef2.toAbs(rPos); 45 if (!ValidAddress(aAbs2)) 46 return true; 47 } 48 return false; 49 } 50 GetNextRef(ScRange & rRange)51bool ScDetectiveRefIter::GetNextRef( ScRange& rRange ) 52 { 53 bool bRet = false; 54 formula::FormulaToken* p = GetNextRefToken(); 55 if( p ) 56 { 57 SingleDoubleRefProvider aProv( *p ); 58 rRange.aStart = aProv.Ref1.toAbs(aPos); 59 rRange.aEnd = aProv.Ref2.toAbs(aPos); 60 bRet = true; 61 } 62 63 return bRet; 64 } 65 GetNextRefToken()66formula::FormulaToken* ScDetectiveRefIter::GetNextRefToken() 67 { 68 formula::FormulaToken* p = maIter.GetNextReferenceRPN(); 69 while (p && lcl_ScDetectiveRefIter_SkipRef(p, aPos)) 70 { 71 p = maIter.GetNextReferenceRPN(); 72 } 73 return p; 74 } 75 76 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 77