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 29*cdf0e10cSrcweir #include "precompiled_reportdesign.hxx" 30*cdf0e10cSrcweir #include "FunctionHelper.hxx" 31*cdf0e10cSrcweir #include <tools/debug.hxx> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir // ============================================================================= 34*cdf0e10cSrcweir namespace rptui 35*cdf0e10cSrcweir { 36*cdf0e10cSrcweir // ============================================================================= 37*cdf0e10cSrcweir using namespace ::com::sun::star; 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir FunctionManager::FunctionManager(const uno::Reference< report::meta::XFunctionManager>& _xMgr) 40*cdf0e10cSrcweir : m_xMgr(_xMgr) 41*cdf0e10cSrcweir { 42*cdf0e10cSrcweir } 43*cdf0e10cSrcweir FunctionManager::~FunctionManager() 44*cdf0e10cSrcweir { 45*cdf0e10cSrcweir } 46*cdf0e10cSrcweir sal_Unicode FunctionManager::getSingleToken(const formula::IFunctionManager::EToken _eToken) const 47*cdf0e10cSrcweir { 48*cdf0e10cSrcweir switch(_eToken) 49*cdf0e10cSrcweir { 50*cdf0e10cSrcweir case eOk: 51*cdf0e10cSrcweir return sal_Unicode('('); 52*cdf0e10cSrcweir case eClose: 53*cdf0e10cSrcweir return sal_Unicode(')'); 54*cdf0e10cSrcweir case eSep: 55*cdf0e10cSrcweir return sal_Unicode(';'); 56*cdf0e10cSrcweir case eArrayOpen: 57*cdf0e10cSrcweir return sal_Unicode('{'); 58*cdf0e10cSrcweir case eArrayClose: 59*cdf0e10cSrcweir return sal_Unicode('}'); 60*cdf0e10cSrcweir } // switch(_eToken) 61*cdf0e10cSrcweir return 0; 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 64*cdf0e10cSrcweir sal_uInt32 FunctionManager::getCount() const 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir return m_xMgr->getCount(); 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 69*cdf0e10cSrcweir const formula::IFunctionCategory* FunctionManager::getCategory(sal_uInt32 _nPos) const 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir if ( _nPos >= m_aCategoryIndex.size() ) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir uno::Reference< report::meta::XFunctionCategory> xCategory = m_xMgr->getCategory(_nPos); 74*cdf0e10cSrcweir ::boost::shared_ptr< FunctionCategory > pCategory(new FunctionCategory(this,_nPos + 1,xCategory)); 75*cdf0e10cSrcweir m_aCategoryIndex.push_back( m_aCategories.insert(TCategoriesMap::value_type(xCategory->getName(),pCategory)).first ); 76*cdf0e10cSrcweir } 77*cdf0e10cSrcweir return m_aCategoryIndex[_nPos]->second.get(); 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 80*cdf0e10cSrcweir const formula::IFunctionDescription* FunctionManager::getFunctionByName(const ::rtl::OUString& _sFunctionName) const 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir const formula::IFunctionDescription* pDesc = NULL; 83*cdf0e10cSrcweir try 84*cdf0e10cSrcweir { 85*cdf0e10cSrcweir pDesc = get(m_xMgr->getFunctionByName(_sFunctionName)).get(); 86*cdf0e10cSrcweir } 87*cdf0e10cSrcweir catch(uno::Exception&) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir return pDesc; 91*cdf0e10cSrcweir } 92*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 93*cdf0e10cSrcweir void FunctionManager::fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& /*_rLastRUFunctions*/) const 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir //const sal_uInt32 nCount = getCount(); 96*cdf0e10cSrcweir //for(sal_uInt32 i = 0 ; i < nCount ; ++i) 97*cdf0e10cSrcweir //{ 98*cdf0e10cSrcweir // const formula::IFunctionCategory* pCategory = getCategory( 99*cdf0e10cSrcweir //} 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 102*cdf0e10cSrcweir ::boost::shared_ptr< FunctionDescription > FunctionManager::get(const uno::Reference< report::meta::XFunctionDescription>& _xFunctionDescription) const 103*cdf0e10cSrcweir { 104*cdf0e10cSrcweir ::boost::shared_ptr< FunctionDescription > pDesc; 105*cdf0e10cSrcweir if ( _xFunctionDescription.is() ) 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir const ::rtl::OUString sFunctionName = _xFunctionDescription->getName(); 108*cdf0e10cSrcweir TFunctionsMap::const_iterator aFunctionFind = m_aFunctions.find(sFunctionName); 109*cdf0e10cSrcweir if ( aFunctionFind == m_aFunctions.end() ) 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir const uno::Reference< report::meta::XFunctionCategory> xCategory = _xFunctionDescription->getCategory(); 112*cdf0e10cSrcweir const ::rtl::OUString sCategoryName = xCategory->getName(); 113*cdf0e10cSrcweir TCategoriesMap::iterator aCategoryFind = m_aCategories.find(sCategoryName); 114*cdf0e10cSrcweir if ( aCategoryFind == m_aCategories.end() ) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir aCategoryFind = m_aCategories.insert(TCategoriesMap::value_type(sCategoryName,::boost::shared_ptr< FunctionCategory > (new FunctionCategory(this,xCategory->getNumber() + 1,xCategory)))).first; 117*cdf0e10cSrcweir m_aCategoryIndex.push_back( aCategoryFind ); 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir aFunctionFind = m_aFunctions.insert(TFunctionsMap::value_type(sFunctionName,::boost::shared_ptr<FunctionDescription>(new FunctionDescription(aCategoryFind->second.get(),_xFunctionDescription)))).first; 120*cdf0e10cSrcweir } // if ( aFind == m_aFunctions.end() ) 121*cdf0e10cSrcweir pDesc = aFunctionFind->second; 122*cdf0e10cSrcweir } // if ( _xFunctionDescription.is() ) 123*cdf0e10cSrcweir return pDesc; 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 126*cdf0e10cSrcweir FunctionCategory::FunctionCategory(const FunctionManager* _pFMgr,sal_uInt32 _nPos,const uno::Reference< report::meta::XFunctionCategory>& _xCategory) 127*cdf0e10cSrcweir : m_xCategory(_xCategory) 128*cdf0e10cSrcweir ,m_nFunctionCount(_xCategory->getCount()) 129*cdf0e10cSrcweir , m_nNumber(_nPos) 130*cdf0e10cSrcweir ,m_pFunctionManager(_pFMgr) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 134*cdf0e10cSrcweir sal_uInt32 FunctionCategory::getCount() const 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir return m_nFunctionCount; 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 139*cdf0e10cSrcweir const formula::IFunctionDescription* FunctionCategory::getFunction(sal_uInt32 _nPos) const 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir if ( _nPos >= m_aFunctions.size() && _nPos < m_nFunctionCount ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir uno::Reference< report::meta::XFunctionDescription> xFunctionDescription = m_xCategory->getFunction(_nPos); 144*cdf0e10cSrcweir ::boost::shared_ptr< FunctionDescription > pFunction = m_pFunctionManager->get(xFunctionDescription); 145*cdf0e10cSrcweir m_aFunctions.push_back( pFunction ); 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir return m_aFunctions[_nPos].get(); 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 150*cdf0e10cSrcweir sal_uInt32 FunctionCategory::getNumber() const 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir return m_nNumber; 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 155*cdf0e10cSrcweir const formula::IFunctionManager* FunctionCategory::getFunctionManager() const 156*cdf0e10cSrcweir { 157*cdf0e10cSrcweir return m_pFunctionManager; 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 160*cdf0e10cSrcweir ::rtl::OUString FunctionCategory::getName() const 161*cdf0e10cSrcweir { 162*cdf0e10cSrcweir return m_xCategory->getName(); 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 165*cdf0e10cSrcweir FunctionDescription::FunctionDescription(const formula::IFunctionCategory* _pFunctionCategory,const uno::Reference< report::meta::XFunctionDescription>& _xFunctionDescription) 166*cdf0e10cSrcweir : m_xFunctionDescription(_xFunctionDescription) 167*cdf0e10cSrcweir , m_pFunctionCategory(_pFunctionCategory) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir m_aParameter = m_xFunctionDescription->getArguments(); 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir ::rtl::OUString FunctionDescription::getFunctionName() const 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir return m_xFunctionDescription->getName(); 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 176*cdf0e10cSrcweir const formula::IFunctionCategory* FunctionDescription::getCategory() const 177*cdf0e10cSrcweir { 178*cdf0e10cSrcweir return m_pFunctionCategory; 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 181*cdf0e10cSrcweir ::rtl::OUString FunctionDescription::getDescription() const 182*cdf0e10cSrcweir { 183*cdf0e10cSrcweir return m_xFunctionDescription->getDescription(); 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 186*cdf0e10cSrcweir xub_StrLen FunctionDescription::getSuppressedArgumentCount() const 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir return static_cast<xub_StrLen>(m_aParameter.getLength()); 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 191*cdf0e10cSrcweir ::rtl::OUString FunctionDescription::getFormula(const ::std::vector< ::rtl::OUString >& _aArguments) const 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir ::rtl::OUString sFormula; 194*cdf0e10cSrcweir try 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir const ::rtl::OUString *pArguments = _aArguments.empty() ? 0 : &_aArguments[0]; 197*cdf0e10cSrcweir sFormula = m_xFunctionDescription->createFormula(uno::Sequence< ::rtl::OUString >(pArguments, _aArguments.size())); 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir catch(const uno::Exception&) 200*cdf0e10cSrcweir { 201*cdf0e10cSrcweir DBG_ERROR("Exception caught!"); 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir return sFormula; 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 206*cdf0e10cSrcweir void FunctionDescription::fillVisibleArgumentMapping(::std::vector<sal_uInt16>& _rArguments) const 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir const sal_Int32 nCount = m_aParameter.getLength(); 209*cdf0e10cSrcweir for(sal_uInt16 i = 0;i < nCount; ++i) 210*cdf0e10cSrcweir { 211*cdf0e10cSrcweir _rArguments.push_back(i); 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 215*cdf0e10cSrcweir void FunctionDescription::initArgumentInfo() const 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 219*cdf0e10cSrcweir ::rtl::OUString FunctionDescription::getSignature() const 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir return m_xFunctionDescription->getSignature(); 222*cdf0e10cSrcweir } 223*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 224*cdf0e10cSrcweir rtl::OString FunctionDescription::getHelpId() const 225*cdf0e10cSrcweir { 226*cdf0e10cSrcweir return rtl::OString(); 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 229*cdf0e10cSrcweir sal_uInt32 FunctionDescription::getParameterCount() const 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir return m_aParameter.getLength(); 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 234*cdf0e10cSrcweir ::rtl::OUString FunctionDescription::getParameterName(sal_uInt32 _nPos) const 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir if ( _nPos < static_cast<sal_uInt32>(m_aParameter.getLength()) ) 237*cdf0e10cSrcweir return m_aParameter[_nPos].Name; 238*cdf0e10cSrcweir return ::rtl::OUString(); 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 241*cdf0e10cSrcweir ::rtl::OUString FunctionDescription::getParameterDescription(sal_uInt32 _nPos) const 242*cdf0e10cSrcweir { 243*cdf0e10cSrcweir if ( _nPos < static_cast<sal_uInt32>(m_aParameter.getLength()) ) 244*cdf0e10cSrcweir return m_aParameter[_nPos].Description; 245*cdf0e10cSrcweir return ::rtl::OUString(); 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 248*cdf0e10cSrcweir bool FunctionDescription::isParameterOptional(sal_uInt32 _nPos) const 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir if ( _nPos < static_cast<sal_uInt32>(m_aParameter.getLength()) ) 251*cdf0e10cSrcweir return m_aParameter[_nPos].IsOptional; 252*cdf0e10cSrcweir return false; 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 255*cdf0e10cSrcweir // ============================================================================= 256*cdf0e10cSrcweir } // rptui 257*cdf0e10cSrcweir // ============================================================================= 258