diff options
Diffstat (limited to 'sc/workben/addin.cxx')
-rw-r--r-- | sc/workben/addin.cxx | 595 |
1 files changed, 595 insertions, 0 deletions
diff --git a/sc/workben/addin.cxx b/sc/workben/addin.cxx new file mode 100644 index 000000000000..68424abfc9c0 --- /dev/null +++ b/sc/workben/addin.cxx @@ -0,0 +1,595 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +#include <usr/factoryhlp.hxx> +#include <usr/macros.hxx> +#include <usr/reflserv.hxx> +#include <vos/mutex.hxx> +#include <vcl/svapp.hxx> +#include <tools/debug.hxx> +#include <tools/date.hxx> +#include <svl/itemprop.hxx> +#include <usr/proptypehlp.hxx> +#include <cppuhelper/factory.hxx> +#include <uno/lbnames.h> +#include <osl/diagnose.h> + +#include <com/sun/star/util/date.hpp> + +#include "addin.hxx" +#include "result.hxx" + +using namespace com::sun::star; + +//------------------------------------------------------------------------ + + +//------------------------------------------------------------------------ + +SMART_UNO_IMPLEMENTATION( ScTestAddIn, UsrObject ); + +#define SCADDIN_SERVICE L"com.sun.star.sheet.AddIn" +#define SCTESTADDIN_SERVICE L"stardiv.one.sheet.DemoAddIn" + +//------------------------------------------------------------------------ + +extern "C" { + +void SAL_CALL component_getImplementationEnvironment( + const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv ) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +sal_Bool SAL_CALL component_writeInfo( + void * pServiceManager, registry::XRegistryKey * pRegistryKey ) +{ + if (pRegistryKey) + { + try + { + UString aImpl = L"/"; + aImpl += ScTestAddIn::getImplementationName_Static(); + aImpl += L"/UNO/SERVICES"; + + uno::Reference<registry::XRegistryKey> xNewKey( + reinterpret_cast<registry::XRegistryKey*>(pRegistryKey)->createKey(aImpl) ); + + uno::Sequence <rtl::OUString> aSequ = ScTestAddIn::getSupportedServiceNames_Static(); + const rtl::OUString * pArray = aSequ.getConstArray(); + for( INT32 i = 0; i < aSequ.getLength(); i++ ) + xNewKey->createKey( pArray[i] ); + + return sal_True; + } + catch (registry::InvalidRegistryException&) + { + OSL_ENSHURE( sal_False, "### InvalidRegistryException!" ); + } + } + return sal_False; +} + +void * SAL_CALL component_getFactory( + const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey ) +{ + void* pRet = 0; + + if ( pServiceManager && UString(pImplName) == ScTestAddIn::getImplementationName_Static() ) + { + uno::Reference<lang::XSingleServiceFactory> xFactory( cppu::createOneInstanceFactory( + reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), + ScTestAddIn::getImplementationName_Static(), + ScTestAddIn_CreateInstance, + ScTestAddIn::getSupportedServiceNames_Static() ) ); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + + return pRet; +} + +} // extern C + +//------------------------------------------------------------------------ + +ScTestAddIn::ScTestAddIn() +{ +} + +ScTestAddIn::~ScTestAddIn() +{ +} + +UString ScTestAddIn::getImplementationName_Static() +{ + return L"stardiv.StarCalc.ScTestAddIn"; +} + +::com::sun::star::uno::Sequence< ::rtl::OUString > ScTestAddIn::getSupportedServiceNames_Static() +{ + uno::Sequence< rtl::OUString > aRet(2); + rtl::OUString* pArray = aRet.getArray(); + pArray[0] = SCADDIN_SERVICE; + pArray[1] = SCTESTADDIN_SERVICE; + return aRet; +} + +uno::Reference<uno::XInterface> ScTestAddIn_CreateInstance( + const uno::Reference<lang::XMultiServiceFactory>& ) +{ + static uno::Reference<uno::XInterface> xInst = (cppu::OWeakObject*)new ScTestAddIn(); + return xInst; +} + + +// XAddIn + +UString ScTestAddIn::getProgrammaticFuntionName(const UString& aDisplayName) + THROWS( (UsrSystemException) ) +{ + //!... + return UString(); +} + +UString ScTestAddIn::getDisplayFunctionName(const UString& aProgrammaticName) + THROWS( (UsrSystemException) ) +{ + // return translated strings + + UString aRet; + if ( aProgrammaticName == L"countParams" ) aRet = L"ParamAnzahl"; + else if ( aProgrammaticName == L"addOne" ) aRet = L"PlusEins"; + else if ( aProgrammaticName == L"repeatStr" ) aRet = L"WiederholeString"; + else if ( aProgrammaticName == L"getDateString" ) aRet = L"Datumsstring"; + else if ( aProgrammaticName == L"getColorValue" ) aRet = L"Farbwert"; + else if ( aProgrammaticName == L"transpose" ) aRet = L"Transponieren"; + else if ( aProgrammaticName == L"transposeInt" ) aRet = L"IntegerTransponieren"; + else if ( aProgrammaticName == L"repeatMultiple" )aRet = L"Mehrfach"; + else if ( aProgrammaticName == L"getStrOrVal" ) aRet = L"StringOderWert"; + else if ( aProgrammaticName == L"callAsync" ) aRet = L"Asynchron"; + return aRet; +} + +UString ScTestAddIn::getFunctionDescription(const UString& aProgrammaticName) + THROWS( (UsrSystemException) ) +{ + // return translated strings + + UString aRet; + if ( aProgrammaticName == L"countParams" ) aRet = L"Gibt die Anzahl der Parameter zurueck."; + else if ( aProgrammaticName == L"addOne" ) aRet = L"Addiert 1 zur uebergebenen Zahl."; + else if ( aProgrammaticName == L"repeatStr" ) aRet = L"Wiederholt eine Zeichenkette."; + else if ( aProgrammaticName == L"getDateString" ) aRet = L"Wandelt ein Datum in eine Zeichenkette."; + else if ( aProgrammaticName == L"getColorValue" ) aRet = L"Gibt den Farbwert eines Zellbereichs zurueck. Bei transparentem Hintergrund wird -1 zurueckgegeben"; + else if ( aProgrammaticName == L"transpose" ) aRet = L"Transponiert eine Matrix."; + else if ( aProgrammaticName == L"transposeInt" ) aRet = L"Transponiert eine Matrix mit Ganzzahlen."; + else if ( aProgrammaticName == L"repeatMultiple" )aRet = L"Wiederholt mehrere Bestandteile."; + else if ( aProgrammaticName == L"getStrOrVal" ) aRet = L"Gibt einen String oder einen Wert zurueck."; + else if ( aProgrammaticName == L"callAsync" ) aRet = L"Test fuer asynchrone Funktion."; + return aRet; +} + +UString ScTestAddIn::getDisplayArgumentName(const UString& aProgrammaticFunctionName, + INT32 nArgument) THROWS( (UsrSystemException) ) +{ + // return translated strings + + UString aRet; + if ( aProgrammaticFunctionName == L"countParams" ) + { + if ( nArgument == 0 ) aRet = L"Parameter"; + } + else if ( aProgrammaticFunctionName == L"addOne" ) + { + if ( nArgument == 0 ) aRet = L"Wert"; + } + else if ( aProgrammaticFunctionName == L"repeatStr" ) + { + if ( nArgument == 0 ) aRet = L"String"; + else if ( nArgument == 1 ) aRet = L"Anzahl"; + } + else if ( aProgrammaticFunctionName == L"getDateString" ) + { + if ( nArgument == 0 ) aRet = L"Dokument"; + else if ( nArgument == 1 ) aRet = L"Wert"; + } + else if ( aProgrammaticFunctionName == L"getColorValue" ) + { + if ( nArgument == 0 ) aRet = L"Bereich"; + } + else if ( aProgrammaticFunctionName == L"transpose" ) + { + if ( nArgument == 0 ) aRet = L"Matrix"; + } + else if ( aProgrammaticFunctionName == L"transposeInt" ) + { + if ( nArgument == 0 ) aRet = L"Matrix"; + } + else if ( aProgrammaticFunctionName == L"repeatMultiple" ) + { + if ( nArgument == 0 ) aRet = L"Anzahl"; + else if ( nArgument == 1 ) aRet = L"Trenner"; + else if ( nArgument == 2 ) aRet = L"Inhalt"; + } + else if ( aProgrammaticFunctionName == L"getStrOrVal" ) + { + if ( nArgument == 0 ) aRet = L"Flag"; + } + else if ( aProgrammaticFunctionName == L"callAsync" ) + { + if ( nArgument == 0 ) aRet = L"Name"; + } + return aRet; +} + +UString ScTestAddIn::getArgumentDescription(const UString& aProgrammaticFunctionName, + INT32 nArgument) THROWS( (UsrSystemException) ) +{ + // return translated strings + + UString aRet; + if ( aProgrammaticFunctionName == L"countParams" ) + { + if ( nArgument == 0 ) aRet = L"Beliebiger Parameter"; + } + else if ( aProgrammaticFunctionName == L"addOne" ) + { + if ( nArgument == 0 ) aRet = L"Der Wert, zu dem 1 addiert wird"; + } + else if ( aProgrammaticFunctionName == L"repeatStr" ) + { + if ( nArgument == 0 ) aRet = L"Der Text, der wiederholt wird"; + else if ( nArgument == 1 ) aRet = L"Die Anzahl der Wiederholungen"; + } + else if ( aProgrammaticFunctionName == L"getDateString" ) + { + if ( nArgument == 0 ) aRet = L"(intern)"; + else if ( nArgument == 1 ) aRet = L"Der Wert, der als Datum formatiert wird"; + } + else if ( aProgrammaticFunctionName == L"getColorValue" ) + { + if ( nArgument == 0 ) aRet = L"Der Bereich, dessen Hintergrundfarbe abgefragt wird"; + } + else if ( aProgrammaticFunctionName == L"transpose" ) + { + if ( nArgument == 0 ) aRet = L"Die Matrix, die transponiert werden soll"; + } + else if ( aProgrammaticFunctionName == L"transposeInt" ) + { + if ( nArgument == 0 ) aRet = L"Die Matrix, die transponiert werden soll"; + } + else if ( aProgrammaticFunctionName == L"repeatMultiple" ) + { + if ( nArgument == 0 ) aRet = L"Anzahl der Wiederholungen"; + else if ( nArgument == 1 ) aRet = L"Text, der zwischen den Inhalten erscheint"; + else if ( nArgument == 2 ) aRet = L"Mehrere Inhalte"; + } + else if ( aProgrammaticFunctionName == L"getStrOrVal" ) + { + if ( nArgument == 0 ) aRet = L"Wenn Flag 0 ist, wird ein Wert zurueckgegeben, sonst ein String."; + } + else if ( aProgrammaticFunctionName == L"callAsync" ) + { + if ( nArgument == 0 ) aRet = L"Ein String"; + } + return aRet; +} + +UString ScTestAddIn::getProgrammaticCategoryName(const UString& aProgrammaticFunctionName) + THROWS( (UsrSystemException) ) +{ + // return non-translated strings + + UString aRet; + if ( aProgrammaticFunctionName == L"countParams" ) aRet = L"Information"; + else if ( aProgrammaticFunctionName == L"addOne" ) aRet = L"Mathematical"; + else if ( aProgrammaticFunctionName == L"repeatStr" ) aRet = L"Text"; + else if ( aProgrammaticFunctionName == L"getDateString" ) aRet = L"Date&Time"; + else if ( aProgrammaticFunctionName == L"getColorValue" ) aRet = L"Spreadsheet"; + else if ( aProgrammaticFunctionName == L"transpose" ) aRet = L"Matrix"; + else if ( aProgrammaticFunctionName == L"transposeInt" ) aRet = L"Matrix"; + else if ( aProgrammaticFunctionName == L"repeatMultiple" )aRet = L"Text"; + else if ( aProgrammaticFunctionName == L"getStrOrVal" ) aRet = L"Add-In"; + else if ( aProgrammaticFunctionName == L"callAsync" ) aRet = L"Realtime"; // new group + return aRet; +} + +UString ScTestAddIn::getDisplayCategoryName(const UString& aProgrammaticFunctionName) + THROWS( (UsrSystemException) ) +{ + // return translated strings + + return L"irgendwas"; // not used for predefined categories +} + +// XLocalizable + +void ScTestAddIn::setLocale(const lang::Locale& eLocale) THROWS( (UsrSystemException) ) +{ + aFuncLoc = eLocale; +// DBG_ERROR( UStringToString(aFuncLoc.Language, CHARSET_SYSTEM) + String("-") + +// UStringToString(aFuncLoc.Country, CHARSET_SYSTEM) ); +} + +::com::sun::star::lang::Locale SAL_CALL ScTestAddIn::getLocale( ) throw(::com::sun::star::uno::RuntimeException) +{ + return aFuncLoc; +} + +// XTestAddIn + +sal_Int32 SAL_CALL ScTestAddIn::countParams( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArgs ) throw(::com::sun::star::uno::RuntimeException) +{ + return aArgs.getLength(); +} + +double SAL_CALL ScTestAddIn::addOne( double fValue ) throw(::com::sun::star::uno::RuntimeException) +{ + return fValue + 1.0; +} + +::rtl::OUString SAL_CALL ScTestAddIn::repeatStr( const ::rtl::OUString& aStr, sal_Int32 nCount ) throw(::com::sun::star::uno::RuntimeException) +{ + String aRet; + String aStrStr = OUStringToString( aStr, CHARSET_SYSTEM ); + for (long i=0; i<nCount; i++) + aRet += aStrStr; + + return StringToOUString( aRet, CHARSET_SYSTEM ); +} + +::rtl::OUString SAL_CALL ScTestAddIn::getDateString( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xCaller, double fValue ) throw(::com::sun::star::uno::RuntimeException) +{ + uno::Any aDateAny = xCaller->getPropertyValue( L"NullDate" ); +//! if ( aDateAny.getReflection()->equals( *Date_getReflection() ) ) + { + util::Date aDate; + aDateAny >>= aDate; + //const Date* pDate = (const Date*)aDateAny.get(); + //if (pDate) + { + //Date aNewDate = *pDate; + Date aNewDate( aDate.Day, aDate.Month, aDate.Year ); + + aNewDate += (long)(fValue+0.5); + + String aRet; + aRet += aNewDate.GetDay(); + aRet += '.'; + aRet += aNewDate.GetMonth(); + aRet += '.'; + aRet += aNewDate.GetYear(); + return StringToOUString( aRet, CHARSET_SYSTEM ); + } + } + + return L"**ERROR**"; +} + +sal_Int32 SAL_CALL ScTestAddIn::getColorValue( const ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange >& xRange ) throw(::com::sun::star::uno::RuntimeException) +{ + uno::Reference<beans::XPropertySet> xProp( xRange, uno::UNO_QUERY ); + if (xProp.is()) + { + long nRet = -1; + uno::Any aTrans = xProp->getPropertyValue( L"IsCellBackgroundTransparent" ); + BOOL bIsTrans; + aTrans >>= bIsTrans; //! dont use >>= for BOOL + if (!bIsTrans) + { + uno::Any aCol = xProp->getPropertyValue( L"CellBackColor" ); + //nRet = NAMESPACE_USR(OPropertyTypeConversion)::toINT32( aCol ); + aCol >>= nRet; + } + return nRet; + } + return 0; +} + +double lcl_GetDoubleElement( const uno::Sequence< uno::Sequence<double> >& aMatrix, long nCol, long nRow ) +{ + if ( nRow < aMatrix.getLength() ) + { + const uno::Sequence<double>& rRowSeq = aMatrix.getConstArray()[nRow]; + if ( nCol < rRowSeq.getLength() ) + return rRowSeq.getConstArray()[nCol]; + } + return 0.0; // error +} + +INT32 lcl_GetLongElement( const uno::Sequence< uno::Sequence<INT32> >& aMatrix, long nCol, long nRow ) +{ + if ( nRow < aMatrix.getLength() ) + { + const uno::Sequence<INT32>& rRowSeq = aMatrix.getConstArray()[nRow]; + if ( nCol < rRowSeq.getLength() ) + return rRowSeq.getConstArray()[nCol]; + } + return 0.0; // error +} + +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > > SAL_CALL ScTestAddIn::transpose( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > >& aMatrix ) throw(::com::sun::star::uno::RuntimeException) +{ + long nRowCount = aMatrix.getLength(); + long nColCount = 0; + if ( nRowCount ) + nColCount = aMatrix.getConstArray()[0].getLength(); + + uno::Sequence< uno::Sequence<double> > aRet( nColCount ); + for (long nCol=0; nCol<nColCount; nCol++) + { + uno::Sequence<double> aSubSeq(nRowCount); + for (long nRow=0; nRow<nRowCount; nRow++) + aSubSeq.getArray()[nRow] = lcl_GetDoubleElement( aMatrix, nCol, nRow ); + + aRet.getArray()[nCol] = aSubSeq; + } + + return aRet; +} + +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< sal_Int32 > > SAL_CALL ScTestAddIn::transposeInt( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< sal_Int32 > >& aMatrix ) throw(::com::sun::star::uno::RuntimeException) +{ + long nRowCount = aMatrix.getLength(); + long nColCount = 0; + if ( nRowCount ) + nColCount = aMatrix.getConstArray()[0].getLength(); + + uno::Sequence< uno::Sequence<INT32> > aRet( nColCount ); + for (long nCol=0; nCol<nColCount; nCol++) + { + uno::Sequence<INT32> aSubSeq(nRowCount); + for (long nRow=0; nRow<nRowCount; nRow++) + aSubSeq.getArray()[nRow] = lcl_GetLongElement( aMatrix, nCol, nRow ); + + aRet.getArray()[nCol] = aSubSeq; + } + + return aRet; +} + +::rtl::OUString SAL_CALL ScTestAddIn::repeatMultiple( sal_Int32 nCount, const ::com::sun::star::uno::Any& aFirst, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aFollow ) throw(::com::sun::star::uno::RuntimeException) +{ + String aSeparator; + if ( !aFirst.hasValue() ) // not specified + aSeparator = ';'; + else + { + rtl::OUString aUStr; + aFirst >>= aUStr; + aSeparator = OUStringToString( aUStr, CHARSET_SYSTEM ); + } + + String aContent; + long nContCount = aFollow.getLength(); + const uno::Any* pArr = aFollow.getConstArray(); + for (long nPos=0; nPos<nContCount; nPos++) + { + if ( nPos > 0 ) + aContent += ' '; + rtl::OUString aUStr; + pArr[nPos] >>= aUStr; + aContent += OUStringToString( aUStr, CHARSET_SYSTEM ); + } + + String aRet; + + for (long i=0; i<nCount; i++) + { + if (i>0) + aRet += aSeparator; + aRet += aContent; + } + + return StringToOUString(aRet, CHARSET_SYSTEM); +} + +::com::sun::star::uno::Any SAL_CALL ScTestAddIn::getStrOrVal( sal_Int32 nFlag ) throw(::com::sun::star::uno::RuntimeException) +{ + uno::Any aRet; + + //! Test + if ( nFlag == 42 ) + { + uno::Sequence<rtl::OUString> aInner(3); + aInner.getArray()[0] = L"Bla"; + aInner.getArray()[1] = L"Fasel"; + aInner.getArray()[2] = L"Suelz"; + uno::Sequence< uno::Sequence<rtl::OUString> > aOuter( &aInner, 1 ); + + //return uno::Any( &aOuter, Sequence< Sequence<UString> >::getReflection() ); + + aRet <<= aOuter; + return aRet; + } + //! Test + + if ( nFlag ) + aRet <<= UString(L"This is a string."); + else + aRet <<= (INT32)42; + + return aRet; +} + +::com::sun::star::uno::Reference< ::com::sun::star::sheet::XVolatileResult > SAL_CALL ScTestAddIn::callAsync( const ::rtl::OUString& aString ) throw(::com::sun::star::uno::RuntimeException) +{ + String aStr = OUStringToString( aString, CHARSET_SYSTEM ); + char c = (char) aStr; + if ( c >= '0' && c <= '9' ) + { + if (!xNumResult.is()) + xNumResult = new ScAddInResult( "Num" ); + return xNumResult; + } + else + { + if (!xAlphaResult.is()) + xAlphaResult = new ScAddInResult( "Str" ); + return xAlphaResult; + } +} + + +// XServiceName + +::rtl::OUString SAL_CALL ScTestAddIn::getServiceName( ) throw(::com::sun::star::uno::RuntimeException) +{ + return SCTESTADDIN_SERVICE; // name of specific AddIn service +} + +// XServiceInfo + +::rtl::OUString SAL_CALL ScTestAddIn::getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) +{ + return getImplementationName_Static(); +} + +sal_Bool SAL_CALL ScTestAddIn::supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException) +{ + return ServiceName == SCADDIN_SERVICE || + ServiceName == SCTESTADDIN_SERVICE; +} + +::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL ScTestAddIn::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) +{ + return getSupportedServiceNames_Static(); +} + +//------------------------------------------------------------------------ + + + |