1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 //------------------------------------------------------------------ 25 // 26 // date functions add in 27 // 28 //------------------------------------------------------------------ 29 30 #ifndef _SCA_DATEFUNC_HXX 31 #define _SCA_DATEFUNC_HXX 32 33 #include <string.h> 34 #include <com/sun/star/lang/XServiceName.hpp> 35 #include <com/sun/star/lang/XServiceInfo.hpp> 36 #include <com/sun/star/sheet/XAddIn.hpp> 37 #include <com/sun/star/sheet/XCompatibilityNames.hpp> 38 #include <com/sun/star/sheet/addin/XDateFunctions.hpp> 39 #include <com/sun/star/sheet/addin/XMiscFunctions.hpp> 40 #include <cppuhelper/implbase6.hxx> // helper for implementations 41 #include <tools/resid.hxx> 42 #include <tools/rc.hxx> 43 #include <tools/resary.hxx> 44 45 //------------------------------------------------------------------ 46 47 class ScaList 48 { 49 private: 50 static const sal_uInt32 nStartSize; 51 static const sal_uInt32 nIncrSize; 52 53 void** pData; // pointer array 54 sal_uInt32 nSize; // array size 55 sal_uInt32 nCount; // next index to be inserted at 56 sal_uInt32 nCurr; // current pos for iterations 57 58 void _Grow(); 59 inline void Grow(); 60 61 public: 62 ScaList(); 63 virtual ~ScaList(); 64 65 inline sal_uInt32 Count() const { return nCount; } 66 67 inline const void* GetObject( sal_uInt32 nIndex ) const 68 { return (nIndex < nCount) ? pData[ nIndex ] : NULL; } 69 70 inline void* First() { return nCount ? pData[ nCurr = 0 ] : NULL; } 71 inline void* Next() { return (nCurr + 1 < nCount) ? pData[ ++nCurr ] : NULL; } 72 73 inline void Append( void* pNew ); 74 void Insert( void* pNew, sal_uInt32 nIndex ); 75 }; 76 77 78 inline void ScaList::Grow() 79 { 80 if( nCount >= nSize ) 81 _Grow(); 82 } 83 84 inline void ScaList::Append( void* pNew ) 85 { 86 Grow(); 87 pData[ nCount++ ] = pNew; 88 } 89 90 91 //------------------------------------------------------------------ 92 93 class ScaStringList : protected ScaList 94 { 95 public: 96 inline ScaStringList() : ScaList() {}; 97 virtual ~ScaStringList(); 98 99 using ScaList::Count; 100 101 inline const ::rtl::OUString* Get( sal_uInt32 nIndex ) const; 102 103 inline ::rtl::OUString* First(); 104 inline ::rtl::OUString* Next(); 105 106 using ScaList::Append; 107 inline void Append( ::rtl::OUString* pNew ); 108 inline void Append( const ::rtl::OUString& rNew ); 109 }; 110 111 112 inline const ::rtl::OUString* ScaStringList::Get( sal_uInt32 nIndex ) const 113 { 114 return static_cast< const ::rtl::OUString* >( ScaList::GetObject( nIndex ) ); 115 } 116 117 inline ::rtl::OUString* ScaStringList::First() 118 { 119 return static_cast< ::rtl::OUString* >( ScaList::First() ); 120 } 121 122 inline ::rtl::OUString* ScaStringList::Next() 123 { 124 return static_cast< ::rtl::OUString* >( ScaList::Next() ); 125 } 126 127 inline void ScaStringList::Append( ::rtl::OUString* pNew ) 128 { 129 ScaList::Append( pNew ); 130 } 131 132 inline void ScaStringList::Append( const ::rtl::OUString& rNew ) 133 { 134 ScaList::Append( new ::rtl::OUString( rNew ) ); 135 } 136 137 138 //------------------------------------------------------------------ 139 140 class ScaResId : public ResId 141 { 142 public: 143 ScaResId( sal_uInt16 nResId, ResMgr& rResMgr ); 144 }; 145 146 147 //------------------------------------------------------------------ 148 149 class ScaResStringLoader : public Resource 150 { 151 private: 152 String aStr; 153 154 public: 155 inline ScaResStringLoader( sal_uInt16 nResId, sal_uInt16 nStrId, ResMgr& rResMgr ); 156 157 inline const String& GetString() const { return aStr; } 158 159 }; 160 161 162 inline ScaResStringLoader::ScaResStringLoader( sal_uInt16 nResId, sal_uInt16 nStrId, ResMgr& rResMgr ) : 163 Resource( ScaResId( nResId, rResMgr ) ), 164 aStr( ScaResId( nStrId, rResMgr ) ) 165 { 166 FreeResource(); 167 } 168 169 170 //------------------------------------------------------------------ 171 172 class ScaResStringArrLoader : public Resource 173 { 174 private: 175 ResStringArray aStrArray; 176 177 public: 178 inline ScaResStringArrLoader( sal_uInt16 nResId, sal_uInt16 nArrayId, ResMgr& rResMgr ); 179 180 inline const ResStringArray& GetStringArray() const { return aStrArray; } 181 }; 182 183 184 185 inline ScaResStringArrLoader::ScaResStringArrLoader( sal_uInt16 nResId, sal_uInt16 nArrayId, ResMgr& rResMgr ) : 186 Resource( ScaResId( nResId, rResMgr ) ), 187 aStrArray( ScaResId( nArrayId, rResMgr ) ) 188 { 189 FreeResource(); 190 } 191 192 193 //------------------------------------------------------------------ 194 195 class ScaResPublisher : public Resource 196 { 197 public: 198 inline ScaResPublisher( const ScaResId& rResId ) : Resource( rResId ) {} 199 200 inline sal_Bool IsAvailableRes( const ResId& rResId ) const 201 { return Resource::IsAvailableRes( rResId ); } 202 inline void FreeResource() 203 { Resource::FreeResource(); } 204 }; 205 206 207 //------------------------------------------------------------------ 208 209 class ScaFuncRes : public Resource 210 { 211 public: 212 ScaFuncRes( ResId& rResId, ResMgr& rResMgr, sal_uInt16 nIndex, ::rtl::OUString& rRet ); 213 }; 214 215 216 //------------------------------------------------------------------ 217 218 enum ScaCategory 219 { 220 ScaCat_AddIn, 221 ScaCat_DateTime, 222 ScaCat_Text, 223 ScaCat_Finance, 224 ScaCat_Inf, 225 ScaCat_Math, 226 ScaCat_Tech 227 }; 228 229 struct ScaFuncDataBase 230 { 231 const sal_Char* pIntName; // internal name (get***) 232 sal_uInt16 nUINameID; // resource ID to UI name 233 sal_uInt16 nDescrID; // resource ID to description, parameter names and ~ description 234 sal_uInt16 nCompListID; // resource ID to list of valid names 235 sal_uInt16 nParamCount; // number of named / described parameters 236 ScaCategory eCat; // function category 237 sal_Bool bDouble; // name already exist in Calc 238 sal_Bool bWithOpt; // first parameter is internal 239 }; 240 241 class ScaFuncData 242 { 243 private: 244 ::rtl::OUString aIntName; // internal name (get***) 245 sal_uInt16 nUINameID; // resource ID to UI name 246 sal_uInt16 nDescrID; // leads also to parameter descriptions! 247 sal_uInt16 nCompListID; // resource ID to list of valid names 248 sal_uInt16 nParamCount; // num of parameters 249 ScaStringList aCompList; // list of all valid names 250 ScaCategory eCat; // function category 251 sal_Bool bDouble; // name already exist in Calc 252 sal_Bool bWithOpt; // first parameter is internal 253 254 public: 255 ScaFuncData( const ScaFuncDataBase& rBaseData, ResMgr& rRscMgr ); 256 virtual ~ScaFuncData(); 257 258 inline sal_uInt16 GetUINameID() const { return nUINameID; } 259 inline sal_uInt16 GetDescrID() const { return nDescrID; } 260 inline ScaCategory GetCategory() const { return eCat; } 261 inline sal_Bool IsDouble() const { return bDouble; } 262 inline sal_Bool HasIntParam() const { return bWithOpt; } 263 264 sal_uInt16 GetStrIndex( sal_uInt16 nParam ) const; 265 inline sal_Bool Is( const ::rtl::OUString& rCompare ) const 266 { return aIntName == rCompare; } 267 268 inline const ScaStringList& GetCompNameList() const { return aCompList; } 269 }; 270 271 272 //------------------------------------------------------------------ 273 274 class ScaFuncDataList : private ScaList 275 { 276 ::rtl::OUString aLastName; 277 sal_uInt32 nLast; 278 279 public: 280 ScaFuncDataList( ResMgr& rResMgr ); 281 virtual ~ScaFuncDataList(); 282 283 using ScaList::Count; 284 285 inline const ScaFuncData* Get( sal_uInt32 nIndex ) const; 286 const ScaFuncData* Get( const ::rtl::OUString& rProgrammaticName ) const; 287 inline ScaFuncData* First(); 288 inline ScaFuncData* Next(); 289 290 using ScaList::Append; 291 inline void Append( ScaFuncData* pNew ) { ScaList::Append( pNew ); } 292 }; 293 294 295 inline const ScaFuncData* ScaFuncDataList::Get( sal_uInt32 nIndex ) const 296 { 297 return static_cast< const ScaFuncData* >( ScaList::GetObject( nIndex ) ); 298 } 299 300 inline ScaFuncData* ScaFuncDataList::First() 301 { 302 return static_cast< ScaFuncData* >( ScaList::First() ); 303 } 304 305 inline ScaFuncData* ScaFuncDataList::Next() 306 { 307 return static_cast< ScaFuncData* >( ScaList::Next() ); 308 } 309 310 311 //------------------------------------------------------------------ 312 //------------------------------------------------------------------ 313 314 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL DateFunctionAddIn_CreateInstance( 315 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); 316 317 318 // THE AddIn class for date functions 319 320 class ScaDateAddIn : public ::cppu::WeakImplHelper6< 321 ::com::sun::star::sheet::XAddIn, 322 ::com::sun::star::sheet::XCompatibilityNames, 323 ::com::sun::star::sheet::addin::XDateFunctions, 324 ::com::sun::star::sheet::addin::XMiscFunctions, 325 ::com::sun::star::lang::XServiceName, 326 ::com::sun::star::lang::XServiceInfo > 327 { 328 private: 329 ::com::sun::star::lang::Locale aFuncLoc; 330 ::com::sun::star::lang::Locale* pDefLocales; 331 ResMgr* pResMgr; 332 ScaFuncDataList* pFuncDataList; 333 334 335 void InitDefLocales(); 336 const ::com::sun::star::lang::Locale& GetLocale( sal_uInt32 nIndex ); 337 ResMgr& GetResMgr() throw( ::com::sun::star::uno::RuntimeException ); 338 void InitData(); 339 340 ::rtl::OUString GetDisplFuncStr( sal_uInt16 nResId ) throw( ::com::sun::star::uno::RuntimeException ); 341 ::rtl::OUString GetFuncDescrStr( sal_uInt16 nResId, sal_uInt16 nStrIndex ) throw( ::com::sun::star::uno::RuntimeException ); 342 343 public: 344 ScaDateAddIn(); 345 virtual ~ScaDateAddIn(); 346 347 static ::rtl::OUString getImplementationName_Static(); 348 static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(); 349 350 // XAddIn 351 virtual ::rtl::OUString SAL_CALL getProgrammaticFuntionName( const ::rtl::OUString& aDisplayName ) throw( ::com::sun::star::uno::RuntimeException ); 352 virtual ::rtl::OUString SAL_CALL getDisplayFunctionName( const ::rtl::OUString& aProgrammaticName ) throw( ::com::sun::star::uno::RuntimeException ); 353 virtual ::rtl::OUString SAL_CALL getFunctionDescription( const ::rtl::OUString& aProgrammaticName ) throw( ::com::sun::star::uno::RuntimeException ); 354 virtual ::rtl::OUString SAL_CALL getDisplayArgumentName( const ::rtl::OUString& aProgrammaticName, sal_Int32 nArgument ) throw( ::com::sun::star::uno::RuntimeException ); 355 virtual ::rtl::OUString SAL_CALL getArgumentDescription( const ::rtl::OUString& aProgrammaticName, sal_Int32 nArgument ) throw( ::com::sun::star::uno::RuntimeException ); 356 virtual ::rtl::OUString SAL_CALL getProgrammaticCategoryName( const ::rtl::OUString& aProgrammaticName ) throw( ::com::sun::star::uno::RuntimeException ); 357 virtual ::rtl::OUString SAL_CALL getDisplayCategoryName( const ::rtl::OUString& aProgrammaticName ) throw( ::com::sun::star::uno::RuntimeException ); 358 359 // XCompatibilityNames 360 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::LocalizedName > SAL_CALL getCompatibilityNames( const ::rtl::OUString& aProgrammaticName ) throw( ::com::sun::star::uno::RuntimeException ); 361 362 // XLocalizable 363 virtual void SAL_CALL setLocale( const ::com::sun::star::lang::Locale& eLocale ) throw( ::com::sun::star::uno::RuntimeException ); 364 virtual ::com::sun::star::lang::Locale SAL_CALL getLocale() throw( ::com::sun::star::uno::RuntimeException ); 365 366 // XServiceName 367 virtual ::rtl::OUString SAL_CALL getServiceName() throw( ::com::sun::star::uno::RuntimeException ); 368 369 // XServiceInfo 370 virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException ); 371 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw( ::com::sun::star::uno::RuntimeException ); 372 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); 373 374 // methods from own interfaces start here 375 376 // XDateFunctions 377 virtual sal_Int32 SAL_CALL getDiffWeeks( 378 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 379 sal_Int32 nEndDate, sal_Int32 nStartDate, 380 sal_Int32 nMode ) 381 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 382 383 virtual sal_Int32 SAL_CALL getDiffMonths( 384 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 385 sal_Int32 nEndDate, sal_Int32 nStartDate, 386 sal_Int32 nMode ) 387 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 388 389 virtual sal_Int32 SAL_CALL getDiffYears( 390 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 391 sal_Int32 nEndDate, sal_Int32 nStartDate, 392 sal_Int32 nMode ) 393 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 394 395 virtual sal_Int32 SAL_CALL getIsLeapYear( 396 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 397 sal_Int32 nDate ) 398 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 399 400 virtual sal_Int32 SAL_CALL getDaysInMonth( 401 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 402 sal_Int32 nDate ) 403 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 404 405 virtual sal_Int32 SAL_CALL getDaysInYear( 406 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 407 sal_Int32 nDate ) 408 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 409 410 virtual sal_Int32 SAL_CALL getWeeksInYear( 411 const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xOptions, 412 sal_Int32 nDate ) 413 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 414 415 // XMiscFunctions 416 virtual ::rtl::OUString SAL_CALL getRot13( 417 const ::rtl::OUString& aSrcText ) 418 throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); 419 }; 420 421 //------------------------------------------------------------------ 422 423 #endif // _SCA_DATEFUNC_HXX 424 425