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