1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "tokenuno.hxx" 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include <com/sun/star/sheet/ComplexReference.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/sheet/ExternalReference.hpp> 35*cdf0e10cSrcweir #include <com/sun/star/sheet/ReferenceFlags.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/sheet/AddressConvention.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/table/CellAddress.hpp> 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include <svl/itemprop.hxx> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include "miscuno.hxx" 42*cdf0e10cSrcweir #include "convuno.hxx" 43*cdf0e10cSrcweir #include "unonames.hxx" 44*cdf0e10cSrcweir #include "unoguard.hxx" 45*cdf0e10cSrcweir #include "token.hxx" 46*cdf0e10cSrcweir #include "compiler.hxx" 47*cdf0e10cSrcweir #include "tokenarray.hxx" 48*cdf0e10cSrcweir #include "docsh.hxx" 49*cdf0e10cSrcweir #include "rangeseq.hxx" 50*cdf0e10cSrcweir #include "externalrefmgr.hxx" 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir using namespace ::formula; 53*cdf0e10cSrcweir using namespace ::com::sun::star; 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir // ============================================================================ 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir const SfxItemPropertyMapEntry* lcl_GetFormulaParserMap() 58*cdf0e10cSrcweir { 59*cdf0e10cSrcweir static SfxItemPropertyMapEntry aFormulaParserMap_Impl[] = 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir {MAP_CHAR_LEN(SC_UNO_COMPILEFAP), 0, &getBooleanCppuType(), 0, 0 }, 62*cdf0e10cSrcweir {MAP_CHAR_LEN(SC_UNO_COMPILEENGLISH), 0, &getBooleanCppuType(), 0, 0 }, 63*cdf0e10cSrcweir {MAP_CHAR_LEN(SC_UNO_IGNORELEADING), 0, &getBooleanCppuType(), 0, 0 }, 64*cdf0e10cSrcweir {MAP_CHAR_LEN(SC_UNO_FORMULACONVENTION), 0, &getCppuType(&sheet::AddressConvention::UNSPECIFIED), 0, 0 }, 65*cdf0e10cSrcweir {MAP_CHAR_LEN(SC_UNO_OPCODEMAP), 0, &getCppuType((uno::Sequence< sheet::FormulaOpCodeMapEntry >*)0), 0, 0 }, 66*cdf0e10cSrcweir {0,0,0,0,0,0} 67*cdf0e10cSrcweir }; 68*cdf0e10cSrcweir return aFormulaParserMap_Impl; 69*cdf0e10cSrcweir } 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScFormulaParserObj, "ScFormulaParserObj", SC_SERVICENAME_FORMULAPARS ) 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir // ============================================================================ 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir ScFormulaParserObj::ScFormulaParserObj(ScDocShell* pDocSh) : 76*cdf0e10cSrcweir mpDocShell( pDocSh ), 77*cdf0e10cSrcweir mnConv( sheet::AddressConvention::UNSPECIFIED ), 78*cdf0e10cSrcweir mbEnglish( false ), 79*cdf0e10cSrcweir mbIgnoreSpaces( true ), 80*cdf0e10cSrcweir mbCompileFAP( false ) 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir mpDocShell->GetDocument()->AddUnoObject(*this); 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir ScFormulaParserObj::~ScFormulaParserObj() 86*cdf0e10cSrcweir { 87*cdf0e10cSrcweir if (mpDocShell) 88*cdf0e10cSrcweir mpDocShell->GetDocument()->RemoveUnoObject(*this); 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir void ScFormulaParserObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) 94*cdf0e10cSrcweir mpDocShell = NULL; 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir // XFormulaParser 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir void ScFormulaParserObj::SetCompilerFlags( ScCompiler& rCompiler ) const 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir static const formula::FormulaGrammar::AddressConvention aConvMap[] = { 102*cdf0e10cSrcweir formula::FormulaGrammar::CONV_OOO, // <- AddressConvention::OOO 103*cdf0e10cSrcweir formula::FormulaGrammar::CONV_XL_A1, // <- AddressConvention::XL_A1 104*cdf0e10cSrcweir formula::FormulaGrammar::CONV_XL_R1C1, // <- AddressConvention::XL_R1C1 105*cdf0e10cSrcweir formula::FormulaGrammar::CONV_XL_OOX, // <- AddressConvention::XL_OOX 106*cdf0e10cSrcweir formula::FormulaGrammar::CONV_LOTUS_A1 // <- AddressConvention::LOTUS_A1 107*cdf0e10cSrcweir }; 108*cdf0e10cSrcweir static const sal_Int16 nConvMapCount = sizeof(aConvMap)/sizeof(aConvMap[0]); 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir // If mxOpCodeMap is not empty it overrides mbEnglish, and vice versa. We 111*cdf0e10cSrcweir // don't need to initialize things twice. 112*cdf0e10cSrcweir if (mxOpCodeMap.get()) 113*cdf0e10cSrcweir rCompiler.SetFormulaLanguage( mxOpCodeMap ); 114*cdf0e10cSrcweir else 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir sal_Int32 nFormulaLanguage = mbEnglish ? 117*cdf0e10cSrcweir sheet::FormulaLanguage::ENGLISH : 118*cdf0e10cSrcweir sheet::FormulaLanguage::NATIVE; 119*cdf0e10cSrcweir ScCompiler::OpCodeMapPtr xMap = rCompiler.GetOpCodeMap( nFormulaLanguage); 120*cdf0e10cSrcweir rCompiler.SetFormulaLanguage( xMap); 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir formula::FormulaGrammar::AddressConvention eConv = formula::FormulaGrammar::CONV_UNSPECIFIED; 124*cdf0e10cSrcweir if (mnConv >= 0 && mnConv < nConvMapCount) 125*cdf0e10cSrcweir eConv = aConvMap[mnConv]; 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir rCompiler.SetRefConvention( eConv ); 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir rCompiler.SetCompileForFAP(mbCompileFAP); 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir rCompiler.SetExternalLinks( maExternalLinks); 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir uno::Sequence<sheet::FormulaToken> SAL_CALL ScFormulaParserObj::parseFormula( 135*cdf0e10cSrcweir const rtl::OUString& aFormula, const table::CellAddress& rReferencePos ) 136*cdf0e10cSrcweir throw (uno::RuntimeException) 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir ScUnoGuard aGuard; 139*cdf0e10cSrcweir uno::Sequence<sheet::FormulaToken> aRet; 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir if (mpDocShell) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir ScDocument* pDoc = mpDocShell->GetDocument(); 144*cdf0e10cSrcweir ScExternalRefManager::ApiGuard aExtRefGuard(pDoc); 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir ScAddress aRefPos( ScAddress::UNINITIALIZED ); 147*cdf0e10cSrcweir ScUnoConversion::FillScAddress( aRefPos, rReferencePos ); 148*cdf0e10cSrcweir ScCompiler aCompiler( pDoc, aRefPos); 149*cdf0e10cSrcweir aCompiler.SetGrammar(pDoc->GetGrammar()); 150*cdf0e10cSrcweir SetCompilerFlags( aCompiler ); 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir ScTokenArray* pCode = aCompiler.CompileString( aFormula ); 153*cdf0e10cSrcweir (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aRet, *pCode ); 154*cdf0e10cSrcweir delete pCode; 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir return aRet; 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir rtl::OUString SAL_CALL ScFormulaParserObj::printFormula( 161*cdf0e10cSrcweir const uno::Sequence<sheet::FormulaToken>& aTokens, const table::CellAddress& rReferencePos ) 162*cdf0e10cSrcweir throw (uno::RuntimeException) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir ScUnoGuard aGuard; 165*cdf0e10cSrcweir rtl::OUString aRet; 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir if (mpDocShell) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir ScDocument* pDoc = mpDocShell->GetDocument(); 170*cdf0e10cSrcweir ScTokenArray aCode; 171*cdf0e10cSrcweir (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aCode, aTokens ); 172*cdf0e10cSrcweir ScAddress aRefPos( ScAddress::UNINITIALIZED ); 173*cdf0e10cSrcweir ScUnoConversion::FillScAddress( aRefPos, rReferencePos ); 174*cdf0e10cSrcweir ScCompiler aCompiler( pDoc, aRefPos, aCode); 175*cdf0e10cSrcweir aCompiler.SetGrammar(pDoc->GetGrammar()); 176*cdf0e10cSrcweir SetCompilerFlags( aCompiler ); 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir rtl::OUStringBuffer aBuffer; 179*cdf0e10cSrcweir aCompiler.CreateStringFromTokenArray( aBuffer ); 180*cdf0e10cSrcweir aRet = aBuffer.makeStringAndClear(); 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir return aRet; 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir // XPropertySet 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScFormulaParserObj::getPropertySetInfo() 189*cdf0e10cSrcweir throw(uno::RuntimeException) 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir ScUnoGuard aGuard; 192*cdf0e10cSrcweir static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( lcl_GetFormulaParserMap() )); 193*cdf0e10cSrcweir return aRef; 194*cdf0e10cSrcweir } 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir void SAL_CALL ScFormulaParserObj::setPropertyValue( 197*cdf0e10cSrcweir const rtl::OUString& aPropertyName, const uno::Any& aValue ) 198*cdf0e10cSrcweir throw(beans::UnknownPropertyException, beans::PropertyVetoException, 199*cdf0e10cSrcweir lang::IllegalArgumentException, lang::WrappedTargetException, 200*cdf0e10cSrcweir uno::RuntimeException) 201*cdf0e10cSrcweir { 202*cdf0e10cSrcweir ScUnoGuard aGuard; 203*cdf0e10cSrcweir String aString(aPropertyName); 204*cdf0e10cSrcweir if ( aString.EqualsAscii( SC_UNO_COMPILEFAP ) ) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir aValue >>= mbCompileFAP; 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_COMPILEENGLISH ) ) 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir bool bOldEnglish = mbEnglish; 211*cdf0e10cSrcweir if (aValue >>= mbEnglish) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir // Need to recreate the symbol map to change English property 214*cdf0e10cSrcweir // because the map is const. So for performance reasons set 215*cdf0e10cSrcweir // CompileEnglish _before_ OpCodeMap! 216*cdf0e10cSrcweir if (mxOpCodeMap.get() && mbEnglish != bOldEnglish) 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir ScDocument* pDoc = mpDocShell->GetDocument(); 219*cdf0e10cSrcweir ScCompiler aCompiler( pDoc, ScAddress()); 220*cdf0e10cSrcweir aCompiler.SetGrammar(pDoc->GetGrammar()); 221*cdf0e10cSrcweir mxOpCodeMap = aCompiler.CreateOpCodeMap( maOpCodeMapping, mbEnglish); 222*cdf0e10cSrcweir } 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir else 225*cdf0e10cSrcweir throw lang::IllegalArgumentException(); 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_FORMULACONVENTION ) ) 228*cdf0e10cSrcweir { 229*cdf0e10cSrcweir aValue >>= mnConv; 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_IGNORELEADING ) ) 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir aValue >>= mbIgnoreSpaces; 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_OPCODEMAP ) ) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir if (aValue >>= maOpCodeMapping) 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir ScDocument* pDoc = mpDocShell->GetDocument(); 240*cdf0e10cSrcweir ScCompiler aCompiler( pDoc, ScAddress()); 241*cdf0e10cSrcweir aCompiler.SetGrammar(pDoc->GetGrammar()); 242*cdf0e10cSrcweir mxOpCodeMap = aCompiler.CreateOpCodeMap( maOpCodeMapping, mbEnglish); 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir else 245*cdf0e10cSrcweir throw lang::IllegalArgumentException(); 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_EXTERNALLINKS ) ) 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir if (!(aValue >>= maExternalLinks)) 250*cdf0e10cSrcweir throw lang::IllegalArgumentException(); 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir else 253*cdf0e10cSrcweir throw beans::UnknownPropertyException(); 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir uno::Any SAL_CALL ScFormulaParserObj::getPropertyValue( const rtl::OUString& aPropertyName ) 257*cdf0e10cSrcweir throw(beans::UnknownPropertyException, lang::WrappedTargetException, 258*cdf0e10cSrcweir uno::RuntimeException) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir ScUnoGuard aGuard; 261*cdf0e10cSrcweir uno::Any aRet; 262*cdf0e10cSrcweir String aString(aPropertyName); 263*cdf0e10cSrcweir if ( aString.EqualsAscii( SC_UNO_COMPILEFAP ) ) 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir aRet <<= mbCompileFAP; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_COMPILEENGLISH ) ) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir aRet <<= mbEnglish; 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_FORMULACONVENTION ) ) 272*cdf0e10cSrcweir { 273*cdf0e10cSrcweir aRet <<= mnConv; 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_IGNORELEADING ) ) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir aRet <<= mbIgnoreSpaces; 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_OPCODEMAP ) ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir aRet <<= maOpCodeMapping; 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir else if ( aString.EqualsAscii( SC_UNO_EXTERNALLINKS ) ) 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir aRet <<= maExternalLinks; 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir else 288*cdf0e10cSrcweir throw beans::UnknownPropertyException(); 289*cdf0e10cSrcweir return aRet; 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFormulaParserObj ) 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir // ============================================================================ 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir void lcl_ExternalRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rRef ) 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir rAPI.Column = rRef.nCol; 299*cdf0e10cSrcweir rAPI.Row = rRef.nRow; 300*cdf0e10cSrcweir rAPI.Sheet = 0; 301*cdf0e10cSrcweir rAPI.RelativeColumn = rRef.nRelCol; 302*cdf0e10cSrcweir rAPI.RelativeRow = rRef.nRelRow; 303*cdf0e10cSrcweir rAPI.RelativeSheet = 0; 304*cdf0e10cSrcweir 305*cdf0e10cSrcweir sal_Int32 nFlags = 0; 306*cdf0e10cSrcweir if ( rRef.IsColRel() ) nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; 307*cdf0e10cSrcweir if ( rRef.IsRowRel() ) nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; 308*cdf0e10cSrcweir if ( rRef.IsColDeleted() ) nFlags |= sheet::ReferenceFlags::COLUMN_DELETED; 309*cdf0e10cSrcweir if ( rRef.IsRowDeleted() ) nFlags |= sheet::ReferenceFlags::ROW_DELETED; 310*cdf0e10cSrcweir if ( rRef.IsFlag3D() ) nFlags |= sheet::ReferenceFlags::SHEET_3D; 311*cdf0e10cSrcweir if ( rRef.IsRelName() ) nFlags |= sheet::ReferenceFlags::RELATIVE_NAME; 312*cdf0e10cSrcweir rAPI.Flags = nFlags; 313*cdf0e10cSrcweir } 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir void lcl_SingleRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rRef ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir rAPI.Column = rRef.nCol; 318*cdf0e10cSrcweir rAPI.Row = rRef.nRow; 319*cdf0e10cSrcweir rAPI.Sheet = rRef.nTab; 320*cdf0e10cSrcweir rAPI.RelativeColumn = rRef.nRelCol; 321*cdf0e10cSrcweir rAPI.RelativeRow = rRef.nRelRow; 322*cdf0e10cSrcweir rAPI.RelativeSheet = rRef.nRelTab; 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir sal_Int32 nFlags = 0; 325*cdf0e10cSrcweir if ( rRef.IsColRel() ) nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; 326*cdf0e10cSrcweir if ( rRef.IsRowRel() ) nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; 327*cdf0e10cSrcweir if ( rRef.IsTabRel() ) nFlags |= sheet::ReferenceFlags::SHEET_RELATIVE; 328*cdf0e10cSrcweir if ( rRef.IsColDeleted() ) nFlags |= sheet::ReferenceFlags::COLUMN_DELETED; 329*cdf0e10cSrcweir if ( rRef.IsRowDeleted() ) nFlags |= sheet::ReferenceFlags::ROW_DELETED; 330*cdf0e10cSrcweir if ( rRef.IsTabDeleted() ) nFlags |= sheet::ReferenceFlags::SHEET_DELETED; 331*cdf0e10cSrcweir if ( rRef.IsFlag3D() ) nFlags |= sheet::ReferenceFlags::SHEET_3D; 332*cdf0e10cSrcweir if ( rRef.IsRelName() ) nFlags |= sheet::ReferenceFlags::RELATIVE_NAME; 333*cdf0e10cSrcweir rAPI.Flags = nFlags; 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir // static 337*cdf0e10cSrcweir bool ScTokenConversion::ConvertToTokenArray( ScDocument& rDoc, 338*cdf0e10cSrcweir ScTokenArray& rTokenArray, const uno::Sequence<sheet::FormulaToken>& rSequence ) 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir return !rTokenArray.Fill(rSequence,rDoc.GetExternalRefManager()); 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir // static 344*cdf0e10cSrcweir bool ScTokenConversion::ConvertToTokenSequence( ScDocument& rDoc, 345*cdf0e10cSrcweir uno::Sequence<sheet::FormulaToken>& rSequence, const ScTokenArray& rTokenArray ) 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir bool bError = false; 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir sal_Int32 nLen = static_cast<sal_Int32>(rTokenArray.GetLen()); 350*cdf0e10cSrcweir formula::FormulaToken** pTokens = rTokenArray.GetArray(); 351*cdf0e10cSrcweir if ( pTokens ) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir rSequence.realloc(nLen); 354*cdf0e10cSrcweir for (sal_Int32 nPos=0; nPos<nLen; nPos++) 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir const formula::FormulaToken& rToken = *pTokens[nPos]; 357*cdf0e10cSrcweir sheet::FormulaToken& rAPI = rSequence[nPos]; 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir OpCode eOpCode = rToken.GetOpCode(); 360*cdf0e10cSrcweir // eOpCode may be changed in the following switch/case 361*cdf0e10cSrcweir switch ( rToken.GetType() ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir case svByte: 364*cdf0e10cSrcweir // Only the count of spaces is stored as "long". Parameter count is ignored. 365*cdf0e10cSrcweir if ( eOpCode == ocSpaces ) 366*cdf0e10cSrcweir rAPI.Data <<= (sal_Int32) rToken.GetByte(); 367*cdf0e10cSrcweir else 368*cdf0e10cSrcweir rAPI.Data.clear(); // no data 369*cdf0e10cSrcweir break; 370*cdf0e10cSrcweir case formula::svDouble: 371*cdf0e10cSrcweir rAPI.Data <<= rToken.GetDouble(); 372*cdf0e10cSrcweir break; 373*cdf0e10cSrcweir case formula::svString: 374*cdf0e10cSrcweir rAPI.Data <<= rtl::OUString( rToken.GetString() ); 375*cdf0e10cSrcweir break; 376*cdf0e10cSrcweir case svExternal: 377*cdf0e10cSrcweir // Function name is stored as string. 378*cdf0e10cSrcweir // Byte (parameter count) is ignored. 379*cdf0e10cSrcweir rAPI.Data <<= rtl::OUString( rToken.GetExternal() ); 380*cdf0e10cSrcweir break; 381*cdf0e10cSrcweir case svSingleRef: 382*cdf0e10cSrcweir { 383*cdf0e10cSrcweir sheet::SingleReference aSingleRef; 384*cdf0e10cSrcweir lcl_SingleRefToApi( aSingleRef, static_cast<const ScToken&>(rToken).GetSingleRef() ); 385*cdf0e10cSrcweir rAPI.Data <<= aSingleRef; 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir break; 388*cdf0e10cSrcweir case formula::svDoubleRef: 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir sheet::ComplexReference aCompRef; 391*cdf0e10cSrcweir lcl_SingleRefToApi( aCompRef.Reference1, static_cast<const ScToken&>(rToken).GetSingleRef() ); 392*cdf0e10cSrcweir lcl_SingleRefToApi( aCompRef.Reference2, static_cast<const ScToken&>(rToken).GetSingleRef2() ); 393*cdf0e10cSrcweir rAPI.Data <<= aCompRef; 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir break; 396*cdf0e10cSrcweir case svIndex: 397*cdf0e10cSrcweir rAPI.Data <<= static_cast<sal_Int32>( rToken.GetIndex() ); 398*cdf0e10cSrcweir break; 399*cdf0e10cSrcweir case svMatrix: 400*cdf0e10cSrcweir if (!ScRangeToSequence::FillMixedArray( rAPI.Data, static_cast<const ScToken&>(rToken).GetMatrix(), true)) 401*cdf0e10cSrcweir rAPI.Data.clear(); 402*cdf0e10cSrcweir break; 403*cdf0e10cSrcweir case svExternalSingleRef: 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir sheet::SingleReference aSingleRef; 406*cdf0e10cSrcweir lcl_ExternalRefToApi( aSingleRef, static_cast<const ScToken&>(rToken).GetSingleRef() ); 407*cdf0e10cSrcweir size_t nCacheId; 408*cdf0e10cSrcweir rDoc.GetExternalRefManager()->getCacheTable( rToken.GetIndex(), rToken.GetString(), false, &nCacheId ); 409*cdf0e10cSrcweir aSingleRef.Sheet = static_cast< sal_Int32 >( nCacheId ); 410*cdf0e10cSrcweir sheet::ExternalReference aExtRef; 411*cdf0e10cSrcweir aExtRef.Index = rToken.GetIndex(); 412*cdf0e10cSrcweir aExtRef.Reference <<= aSingleRef; 413*cdf0e10cSrcweir rAPI.Data <<= aExtRef; 414*cdf0e10cSrcweir eOpCode = ocPush; 415*cdf0e10cSrcweir } 416*cdf0e10cSrcweir break; 417*cdf0e10cSrcweir case svExternalDoubleRef: 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir sheet::ComplexReference aComplRef; 420*cdf0e10cSrcweir lcl_ExternalRefToApi( aComplRef.Reference1, static_cast<const ScToken&>(rToken).GetSingleRef() ); 421*cdf0e10cSrcweir lcl_ExternalRefToApi( aComplRef.Reference2, static_cast<const ScToken&>(rToken).GetSingleRef2() ); 422*cdf0e10cSrcweir size_t nCacheId; 423*cdf0e10cSrcweir rDoc.GetExternalRefManager()->getCacheTable( rToken.GetIndex(), rToken.GetString(), false, &nCacheId ); 424*cdf0e10cSrcweir aComplRef.Reference1.Sheet = static_cast< sal_Int32 >( nCacheId ); 425*cdf0e10cSrcweir // NOTE: This assumes that cached sheets are in consecutive order! 426*cdf0e10cSrcweir aComplRef.Reference2.Sheet = aComplRef.Reference1.Sheet + (static_cast<const ScToken&>(rToken).GetSingleRef2().nTab - static_cast<const ScToken&>(rToken).GetSingleRef().nTab); 427*cdf0e10cSrcweir sheet::ExternalReference aExtRef; 428*cdf0e10cSrcweir aExtRef.Index = rToken.GetIndex(); 429*cdf0e10cSrcweir aExtRef.Reference <<= aComplRef; 430*cdf0e10cSrcweir rAPI.Data <<= aExtRef; 431*cdf0e10cSrcweir eOpCode = ocPush; 432*cdf0e10cSrcweir } 433*cdf0e10cSrcweir break; 434*cdf0e10cSrcweir case svExternalName: 435*cdf0e10cSrcweir { 436*cdf0e10cSrcweir sheet::ExternalReference aExtRef; 437*cdf0e10cSrcweir aExtRef.Index = rToken.GetIndex(); 438*cdf0e10cSrcweir aExtRef.Reference <<= ::rtl::OUString( rToken.GetString() ); 439*cdf0e10cSrcweir rAPI.Data <<= aExtRef; 440*cdf0e10cSrcweir eOpCode = ocPush; 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir break; 443*cdf0e10cSrcweir default: 444*cdf0e10cSrcweir DBG_ERROR1( "ScTokenConversion::ConvertToTokenSequence: unhandled token type SvStackVar %d", rToken.GetType()); 445*cdf0e10cSrcweir case svSep: // occurs with ocSep, ocOpen, ocClose, ocArray* 446*cdf0e10cSrcweir case svJump: // occurs with ocIf, ocChose 447*cdf0e10cSrcweir case svMissing: // occurs with ocMissing 448*cdf0e10cSrcweir rAPI.Data.clear(); // no data 449*cdf0e10cSrcweir } 450*cdf0e10cSrcweir rAPI.OpCode = static_cast<sal_Int32>(eOpCode); //! assuming equal values for the moment 451*cdf0e10cSrcweir } 452*cdf0e10cSrcweir } 453*cdf0e10cSrcweir else 454*cdf0e10cSrcweir rSequence.realloc(0); 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir return !bError; 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir // ============================================================================ 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir ScFormulaOpCodeMapperObj::ScFormulaOpCodeMapperObj(::std::auto_ptr<formula::FormulaCompiler> _pCompiler) 462*cdf0e10cSrcweir : formula::FormulaOpCodeMapperObj(_pCompiler) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir // ============================================================================ 467*cdf0e10cSrcweir 468