xref: /trunk/main/reportdesign/source/ui/misc/FunctionHelper.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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