xref: /aoo41x/main/sc/inc/addincol.hxx (revision 38d50f7b)
1*38d50f7bSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*38d50f7bSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*38d50f7bSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*38d50f7bSAndrew Rist  * distributed with this work for additional information
6*38d50f7bSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*38d50f7bSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*38d50f7bSAndrew Rist  * "License"); you may not use this file except in compliance
9*38d50f7bSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*38d50f7bSAndrew Rist  *
11*38d50f7bSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*38d50f7bSAndrew Rist  *
13*38d50f7bSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*38d50f7bSAndrew Rist  * software distributed under the License is distributed on an
15*38d50f7bSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*38d50f7bSAndrew Rist  * KIND, either express or implied.  See the License for the
17*38d50f7bSAndrew Rist  * specific language governing permissions and limitations
18*38d50f7bSAndrew Rist  * under the License.
19*38d50f7bSAndrew Rist  *
20*38d50f7bSAndrew Rist  *************************************************************/
21*38d50f7bSAndrew Rist 
22*38d50f7bSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef SC_ADDINCOL_HXX
25cdf0e10cSrcweir #define SC_ADDINCOL_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "global.hxx"
28cdf0e10cSrcweir #include <com/sun/star/sheet/XVolatileResult.hpp>
29cdf0e10cSrcweir #include <com/sun/star/sheet/XAddIn.hpp>
30cdf0e10cSrcweir #include <com/sun/star/sheet/XResultListener.hpp>
31cdf0e10cSrcweir #include <com/sun/star/sheet/ResultEvent.hpp>
32cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
33cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlMethod.hpp>
34cdf0e10cSrcweir #include <com/sun/star/sheet/LocalizedName.hpp>
35cdf0e10cSrcweir #include <tools/string.hxx>
36cdf0e10cSrcweir #include <i18npool/lang.h>
37cdf0e10cSrcweir #include <rtl/ustring.h>
38cdf0e10cSrcweir #include "scdllapi.h"
39cdf0e10cSrcweir #include <rtl/ustring.hxx>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #ifndef SC_SCMATRIX_HXX
42cdf0e10cSrcweir #include "scmatrix.hxx"
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <hash_map>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 
48cdf0e10cSrcweir class String;
49cdf0e10cSrcweir class SfxObjectShell;
50cdf0e10cSrcweir class ScUnoAddInFuncData;
51cdf0e10cSrcweir class ScMatrix;
52cdf0e10cSrcweir class ScFuncDesc;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
55cdf0e10cSrcweir typedef ::std::hash_map< String, const ScUnoAddInFuncData*, ScStringHashCode, ::std::equal_to< String > > ScAddInHashMap;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 
58cdf0e10cSrcweir enum ScAddInArgumentType
59cdf0e10cSrcweir {
60cdf0e10cSrcweir 	SC_ADDINARG_NONE,					// -
61cdf0e10cSrcweir 	SC_ADDINARG_INTEGER,				// long
62cdf0e10cSrcweir 	SC_ADDINARG_DOUBLE,					// double
63cdf0e10cSrcweir 	SC_ADDINARG_STRING,					// string
64cdf0e10cSrcweir 	SC_ADDINARG_INTEGER_ARRAY,			// sequence<sequence<long>>
65cdf0e10cSrcweir 	SC_ADDINARG_DOUBLE_ARRAY,			// sequence<sequence<double>>
66cdf0e10cSrcweir 	SC_ADDINARG_STRING_ARRAY,			// sequence<sequence<string>>
67cdf0e10cSrcweir 	SC_ADDINARG_MIXED_ARRAY,			// sequence<sequence<any>>
68cdf0e10cSrcweir 	SC_ADDINARG_VALUE_OR_ARRAY,			// any
69cdf0e10cSrcweir 	SC_ADDINARG_CELLRANGE,				// XCellRange
70cdf0e10cSrcweir 	SC_ADDINARG_CALLER,					// XPropertySet
71cdf0e10cSrcweir 	SC_ADDINARG_VARARGS					// sequence<any>
72cdf0e10cSrcweir };
73cdf0e10cSrcweir 
74cdf0e10cSrcweir //------------------------------------------------------------------------
75cdf0e10cSrcweir 
76cdf0e10cSrcweir struct ScAddInArgDesc
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     String              aInternalName;      // used to match configuration and reflection information
79cdf0e10cSrcweir     String              aName;
80cdf0e10cSrcweir     String              aDescription;
81cdf0e10cSrcweir     ScAddInArgumentType eType;
82cdf0e10cSrcweir     sal_Bool                bOptional;
83cdf0e10cSrcweir };
84cdf0e10cSrcweir 
85cdf0e10cSrcweir class ScUnoAddInFuncData
86cdf0e10cSrcweir {
87cdf0e10cSrcweir private:
88cdf0e10cSrcweir     String              aOriginalName;      // kept in formula
89cdf0e10cSrcweir     String              aLocalName;         // for display
90cdf0e10cSrcweir     String              aUpperName;         // for entering formulas
91cdf0e10cSrcweir     String              aUpperLocal;        // for entering formulas
92cdf0e10cSrcweir     String              aDescription;
93cdf0e10cSrcweir     com::sun::star::uno::Reference< com::sun::star::reflection::XIdlMethod> xFunction;
94cdf0e10cSrcweir     com::sun::star::uno::Any            aObject;
95cdf0e10cSrcweir     long                nArgCount;
96cdf0e10cSrcweir     ScAddInArgDesc*     pArgDescs;
97cdf0e10cSrcweir     long                nCallerPos;
98cdf0e10cSrcweir     sal_uInt16              nCategory;
99cdf0e10cSrcweir     rtl::OString        sHelpId;
100cdf0e10cSrcweir     mutable com::sun::star::uno::Sequence< com::sun::star::sheet::LocalizedName> aCompNames;
101cdf0e10cSrcweir     mutable sal_Bool        bCompInitialized;
102cdf0e10cSrcweir 
103cdf0e10cSrcweir public:
104cdf0e10cSrcweir                 ScUnoAddInFuncData( const String& rNam, const String& rLoc,
105cdf0e10cSrcweir                                     const String& rDesc,
106cdf0e10cSrcweir                                     sal_uInt16 nCat, const rtl::OString&,
107cdf0e10cSrcweir                                     const com::sun::star::uno::Reference<
108cdf0e10cSrcweir                                         com::sun::star::reflection::XIdlMethod>& rFunc,
109cdf0e10cSrcweir                                     const com::sun::star::uno::Any& rO,
110cdf0e10cSrcweir                                     long nAC, const ScAddInArgDesc* pAD,
111cdf0e10cSrcweir                                     long nCP );
112cdf0e10cSrcweir                 ~ScUnoAddInFuncData();
113cdf0e10cSrcweir 
GetOriginalName() const114cdf0e10cSrcweir     const String&           GetOriginalName() const     { return aOriginalName; }
GetLocalName() const115cdf0e10cSrcweir     const String&           GetLocalName() const        { return aLocalName; }
GetUpperName() const116cdf0e10cSrcweir     const String&           GetUpperName() const        { return aUpperName; }
GetUpperLocal() const117cdf0e10cSrcweir     const String&           GetUpperLocal() const       { return aUpperLocal; }
GetFunction() const118cdf0e10cSrcweir     const com::sun::star::uno::Reference< com::sun::star::reflection::XIdlMethod>&   GetFunction() const
119cdf0e10cSrcweir                                                         { return xFunction; }
GetObject() const120cdf0e10cSrcweir     const com::sun::star::uno::Any& GetObject() const   { return aObject; }
GetArgumentCount() const121cdf0e10cSrcweir     long                    GetArgumentCount() const    { return nArgCount; }
GetArguments() const122cdf0e10cSrcweir     const ScAddInArgDesc*   GetArguments() const        { return pArgDescs; }
GetCallerPos() const123cdf0e10cSrcweir     long                    GetCallerPos() const        { return nCallerPos; }
GetDescription() const124cdf0e10cSrcweir     const String&           GetDescription() const      { return aDescription; }
GetCategory() const125cdf0e10cSrcweir     sal_uInt16                  GetCategory() const         { return nCategory; }
GetHelpId() const126cdf0e10cSrcweir     const rtl::OString      GetHelpId() const           { return sHelpId; }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     const com::sun::star::uno::Sequence< com::sun::star::sheet::LocalizedName>&  GetCompNames() const;
129cdf0e10cSrcweir     sal_Bool                    GetExcelName( LanguageType eDestLang, String& rRetExcelName ) const;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     void    SetFunction( const com::sun::star::uno::Reference< com::sun::star::reflection::XIdlMethod>& rNewFunc,
132cdf0e10cSrcweir                          const com::sun::star::uno::Any& rNewObj );
133cdf0e10cSrcweir     void    SetArguments( long nNewCount, const ScAddInArgDesc* pNewDescs );
134cdf0e10cSrcweir     void    SetCallerPos( long nNewPos );
135cdf0e10cSrcweir     void    SetCompNames( const com::sun::star::uno::Sequence< com::sun::star::sheet::LocalizedName>& rNew );
136cdf0e10cSrcweir };
137cdf0e10cSrcweir 
138cdf0e10cSrcweir //------------------------------------------------------------------------
139cdf0e10cSrcweir 
140cdf0e10cSrcweir class SC_DLLPUBLIC ScUnoAddInCollection
141cdf0e10cSrcweir {
142cdf0e10cSrcweir private:
143cdf0e10cSrcweir 	long					nFuncCount;
144cdf0e10cSrcweir 	ScUnoAddInFuncData**	ppFuncData;
145cdf0e10cSrcweir     ScAddInHashMap*         pExactHashMap;      // exact internal name
146cdf0e10cSrcweir     ScAddInHashMap*         pNameHashMap;       // internal name upper
147cdf0e10cSrcweir     ScAddInHashMap*         pLocalHashMap;      // localized name upper
148cdf0e10cSrcweir 	sal_Bool					bInitialized;
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	void		Initialize();
151cdf0e10cSrcweir     void        ReadConfiguration();
152cdf0e10cSrcweir 	void		ReadFromAddIn( const com::sun::star::uno::Reference<
153cdf0e10cSrcweir 								com::sun::star::uno::XInterface>& xInterface );
154cdf0e10cSrcweir     void        UpdateFromAddIn( const com::sun::star::uno::Reference<
155cdf0e10cSrcweir 								  com::sun::star::uno::XInterface>& xInterface,
156cdf0e10cSrcweir 								const String& rServiceName );
157cdf0e10cSrcweir     void        LoadComponent( const ScUnoAddInFuncData& rFuncData );
158cdf0e10cSrcweir 
159cdf0e10cSrcweir public:
160cdf0e10cSrcweir 				ScUnoAddInCollection();
161cdf0e10cSrcweir 				~ScUnoAddInCollection();
162cdf0e10cSrcweir 
163cdf0e10cSrcweir                         /// User enetered name. rUpperName MUST already be upper case!
164cdf0e10cSrcweir 	String				FindFunction( const String& rUpperName, sal_Bool bLocalFirst );
165cdf0e10cSrcweir 
166cdf0e10cSrcweir                         // rName is the exact Name.
167cdf0e10cSrcweir                         // Only if bComplete is set, the function reference and argument types
168cdf0e10cSrcweir                         // are initialized (component may have to be loaded).
169cdf0e10cSrcweir     const ScUnoAddInFuncData*   GetFuncData( const String& rName, bool bComplete = false );
170cdf0e10cSrcweir 
171cdf0e10cSrcweir                         /** For enumeration in ScCompiler::OpCodeMap::getAvailableMappings().
172cdf0e10cSrcweir                             @param nIndex
173cdf0e10cSrcweir                                 0 <= nIndex < GetFuncCount()
174cdf0e10cSrcweir                          */
175cdf0e10cSrcweir     const ScUnoAddInFuncData*   GetFuncData( long nIndex );
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     void                Clear();
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 	void				LocalizeString( String& rName );	// modify rName - input: exact name
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 	long				GetFuncCount();
182cdf0e10cSrcweir 	sal_Bool				FillFunctionDesc( long nFunc, ScFuncDesc& rDesc );
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     static sal_Bool         FillFunctionDescFromData( const ScUnoAddInFuncData& rFuncData, ScFuncDesc& rDesc );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 	sal_Bool				GetExcelName( const String& rCalcName, LanguageType eDestLang, String& rRetExcelName );
187cdf0e10cSrcweir 	sal_Bool				GetCalcName( const String& rExcelName, String& rRetCalcName );
188cdf0e10cSrcweir 								// both leave rRet... unchanged, if no matching name is found
189cdf0e10cSrcweir };
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 
192cdf0e10cSrcweir class ScUnoAddInCall
193cdf0e10cSrcweir {
194cdf0e10cSrcweir private:
195cdf0e10cSrcweir 	const ScUnoAddInFuncData*	pFuncData;
196cdf0e10cSrcweir 	com::sun::star::uno::Sequence<com::sun::star::uno::Any>			aArgs;
197cdf0e10cSrcweir 	com::sun::star::uno::Sequence<com::sun::star::uno::Any>			aVarArg;
198cdf0e10cSrcweir 	com::sun::star::uno::Reference<com::sun::star::uno::XInterface>	xCaller;
199cdf0e10cSrcweir 	sal_Bool						bValidCount;
200cdf0e10cSrcweir 	// result:
201cdf0e10cSrcweir 	sal_uInt16						nErrCode;
202cdf0e10cSrcweir 	sal_Bool						bHasString;
203cdf0e10cSrcweir 	double						fValue;
204cdf0e10cSrcweir 	String						aString;
205cdf0e10cSrcweir 	ScMatrixRef			        xMatrix;
206cdf0e10cSrcweir 	com::sun::star::uno::Reference<com::sun::star::sheet::XVolatileResult> xVarRes;
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	void			ExecuteCallWithArgs(
209cdf0e10cSrcweir 						com::sun::star::uno::Sequence<com::sun::star::uno::Any>& rCallArgs);
210cdf0e10cSrcweir 
211cdf0e10cSrcweir public:
212cdf0e10cSrcweir 					// exact name
213cdf0e10cSrcweir 					ScUnoAddInCall( ScUnoAddInCollection& rColl, const String& rName,
214cdf0e10cSrcweir 									long nParamCount );
215cdf0e10cSrcweir 					~ScUnoAddInCall();
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 	sal_Bool				NeedsCaller() const;
218cdf0e10cSrcweir 	void				SetCaller( const com::sun::star::uno::Reference<
219cdf0e10cSrcweir 									com::sun::star::uno::XInterface>& rInterface );
220cdf0e10cSrcweir 	void				SetCallerFromObjectShell( SfxObjectShell* pSh );
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 	sal_Bool				ValidParamCount();
223cdf0e10cSrcweir 	ScAddInArgumentType	GetArgType( long nPos );
224cdf0e10cSrcweir 	void				SetParam( long nPos, const com::sun::star::uno::Any& rValue );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 	void				ExecuteCall();
227cdf0e10cSrcweir 
228cdf0e10cSrcweir 	void				SetResult( const com::sun::star::uno::Any& rNewRes );
229cdf0e10cSrcweir 
GetErrCode() const230cdf0e10cSrcweir 	sal_uInt16				GetErrCode() const		{ return nErrCode; }
HasString() const231cdf0e10cSrcweir 	sal_Bool				HasString() const		{ return bHasString; }
HasMatrix() const232cdf0e10cSrcweir 	sal_Bool				HasMatrix() const		{ return ( xMatrix.Is() ); }
HasVarRes() const233cdf0e10cSrcweir 	sal_Bool				HasVarRes() const		{ return ( xVarRes.is() ); }
GetValue() const234cdf0e10cSrcweir 	double				GetValue() const		{ return fValue; }
GetString() const235cdf0e10cSrcweir 	const String&		GetString() const		{ return aString; }
GetMatrix() const236cdf0e10cSrcweir 	ScMatrixRef	        GetMatrix() const		{ return xMatrix; }
237cdf0e10cSrcweir 	com::sun::star::uno::Reference<com::sun::star::sheet::XVolatileResult>
GetVarRes() const238cdf0e10cSrcweir 						GetVarRes() const		{ return xVarRes; }
239cdf0e10cSrcweir };
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 
242cdf0e10cSrcweir #endif
243cdf0e10cSrcweir 
244