blob: 7ef42a30bce3a7463aee5e0a774de02daf73c2bf [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <cppuhelper/bootstrap.hxx>
#include <com/sun/star/util/XURLTransformer.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/frame/XDesktop.hpp>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/frame/XModel2.hpp>
#include <com/sun/star/script/XDefaultProperty.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/lang/XMultiComponentFactory.hpp>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XIntrospection.hpp>
#include <com/sun/star/util/MeasureUnit.hpp>
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/awt/XDialog.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <ooo/vba/msforms/XShape.hpp>
#include <comphelper/processfactory.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/app.hxx>
#include <svl/stritem.hxx>
#include <svl/eitem.hxx>
#include <svl/intitem.hxx>
#include <svl/itemset.hxx>
#include <sfx2/docfac.hxx>
#include <sfx2/viewfac.hxx>
#include <basic/sbx.hxx>
#include <basic/sbstar.hxx>
#include <basic/basmgr.hxx>
#include <basic/sbmod.hxx>
#include <basic/sbmeth.hxx>
#include <rtl/math.hxx>
#include <sfx2/viewsh.hxx>
#include <math.h>
#include <tools/urlobj.hxx>
#include <osl/file.hxx>
#include <toolkit/awt/vclxwindow.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <vcl/window.hxx>
#include <vcl/syswin.hxx>
#include <tools/diagnose_ex.h>
#ifndef OOVBA_DLLIMPLEMENTATION
#define OOVBA_DLLIMPLEMENTATION
#endif
#include <vbahelper/vbahelper.hxx>
#include <sfx2/app.hxx>
// #FIXME needs service
//#include "vbashape.hxx"
//#include "unonames.hxx"
using namespace ::com::sun::star;
using namespace ::ooo::vba;
void unoToSbxValue( SbxVariable* pVar, const uno::Any& aValue );
uno::Any sbxToUnoValue( SbxVariable* pVar );
namespace ooo
{
namespace vba
{
namespace { const double factor = 2540.0 / 72.0; }
css::uno::Reference< css::uno::XInterface > createVBAUnoAPIService( SfxObjectShell* pShell, const sal_Char* _pAsciiName ) throw (css::uno::RuntimeException)
{
OSL_PRECOND( pShell, "createVBAUnoAPIService: no shell!" );
::rtl::OUString sVarName( ::rtl::OUString::createFromAscii( _pAsciiName ) );
return getVBAServiceFactory( pShell )->createInstance( sVarName );
}
// helper method to determine if the view ( calc ) is in print-preview mode
bool isInPrintPreview( SfxViewFrame* pView )
{
sal_uInt16 nViewNo = SID_VIEWSHELL1 - SID_VIEWSHELL0;
if ( pView->GetObjectShell()->GetFactory().GetViewFactoryCount() >
nViewNo && !pView->GetObjectShell()->IsInPlaceActive() )
{
SfxViewFactory &rViewFactory =
pView->GetObjectShell()->GetFactory().GetViewFactory(nViewNo);
if ( pView->GetCurViewId() == rViewFactory.GetOrdinal() )
return true;
}
return false;
}
#if 0
namespace excel // all in this namespace probably can be moved to sc
{
const ::rtl::OUString REPLACE_CELLS_WARNING( RTL_CONSTASCII_USTRINGPARAM( "ReplaceCellsWarning"));
class PasteCellsWarningReseter
{
private:
bool bInitialWarningState;
static uno::Reference< beans::XPropertySet > getGlobalSheetSettings() throw ( uno::RuntimeException )
{
static uno::Reference< beans::XPropertySet > xTmpProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
static uno::Reference<uno::XComponentContext > xContext( xTmpProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW );
static uno::Reference<lang::XMultiComponentFactory > xServiceManager(
xContext->getServiceManager(), uno::UNO_QUERY_THROW );
static uno::Reference< beans::XPropertySet > xProps( xServiceManager->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.GlobalSheetSettings" ) ) ,xContext ), uno::UNO_QUERY_THROW );
return xProps;
}
bool getReplaceCellsWarning() throw ( uno::RuntimeException )
{
sal_Bool res = sal_False;
getGlobalSheetSettings()->getPropertyValue( REPLACE_CELLS_WARNING ) >>= res;
return ( res == sal_True );
}
void setReplaceCellsWarning( bool bState ) throw ( uno::RuntimeException )
{
getGlobalSheetSettings()->setPropertyValue( REPLACE_CELLS_WARNING, uno::makeAny( bState ) );
}
public:
PasteCellsWarningReseter() throw ( uno::RuntimeException )
{
bInitialWarningState = getReplaceCellsWarning();
if ( bInitialWarningState )
setReplaceCellsWarning( false );
}
~PasteCellsWarningReseter()
{
if ( bInitialWarningState )
{
// don't allow dtor to throw
try
{
setReplaceCellsWarning( true );
}
catch ( uno::Exception& /*e*/ ){}
}
}
};
void
implnPaste()
{
PasteCellsWarningReseter resetWarningBox;
ScTabViewShell* pViewShell = getCurrentBestViewShell();
if ( pViewShell )
{
pViewShell->PasteFromSystem();
pViewShell->CellContentChanged();
}
}
void
implnCopy()
{
ScTabViewShell* pViewShell = getCurrentBestViewShell();
if ( pViewShell )
pViewShell->CopyToClip(NULL,false,false,true);
}
void
implnCut()
{
ScTabViewShell* pViewShell = getCurrentBestViewShell();
if ( pViewShell )
pViewShell->CutToClip( NULL, sal_True );
}
void implnPasteSpecial(SfxViewShell* pViewShell, sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty, sal_Bool bTranspose)
{
PasteCellsWarningReseter resetWarningBox;
sal_Bool bAsLink(sal_False), bOtherDoc(sal_False);
InsCellCmd eMoveMode = INS_NONE;
if ( !pTabViewShell )
// none active, try next best
pTabViewShell = getCurrentBestViewShell();
if ( pTabViewShell )
{
ScViewData* pView = pTabViewShell->GetViewData();
Window* pWin = ( pView != NULL ) ? pView->GetActiveWin() : NULL;
if ( pView && pWin )
{
if ( bAsLink && bOtherDoc )
pTabViewShell->PasteFromSystem(0);//SOT_FORMATSTR_ID_LINK
else
{
ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin );
ScDocument* pDoc = NULL;
if ( pOwnClip )
pDoc = pOwnClip->GetDocument();
pTabViewShell->PasteFromClip( nFlags, pDoc,
nFunction, bSkipEmpty, bTranspose, bAsLink,
eMoveMode, IDF_NONE, sal_True );
pTabViewShell->CellContentChanged();
}
}
}
}
ScDocShell*
getDocShell( css::uno::Reference< css::frame::XModel>& xModel )
{
uno::Reference< uno::XInterface > xIf( xModel, uno::UNO_QUERY_THROW );
ScModelObj* pModel = dynamic_cast< ScModelObj* >( xIf.get() );
ScDocShell* pDocShell = NULL;
if ( pModel )
pDocShell = (ScDocShell*)pModel->GetEmbeddedObject();
return pDocShell;
}
ScTabViewShell*
getBestViewShell( css::uno::Reference< css::frame::XModel>& xModel )
{
ScDocShell* pDocShell = getDocShell( xModel );
if ( pDocShell )
return pDocShell->GetBestViewShell();
return NULL;
}
ScTabViewShell*
getCurrentBestViewShell()
{
uno::Reference< frame::XModel > xModel = getCurrentDocument();
return getBestViewShell( xModel );
}
SfxViewFrame*
getCurrentViewFrame()
{
ScTabViewShell* pViewShell = getCurrentBestViewShell();
if ( pViewShell )
return pViewShell->GetViewFrame();
return NULL;
}
};
#endif
uno::Reference< beans::XIntrospectionAccess >
getIntrospectionAccess( const uno::Any& aObject ) throw (uno::RuntimeException)
{
static uno::Reference< beans::XIntrospection > xIntrospection;
if( !xIntrospection.is() )
{
uno::Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
xIntrospection.set( xFactory->createInstance( rtl::OUString::createFromAscii("com.sun.star.beans.Introspection") ), uno::UNO_QUERY_THROW );
}
return xIntrospection->inspect( aObject );
}
uno::Reference< script::XTypeConverter >
getTypeConverter( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
{
static uno::Reference< script::XTypeConverter > xTypeConv( xContext->getServiceManager()->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter") ), xContext ), uno::UNO_QUERY_THROW );
return xTypeConv;
}
const uno::Any&
aNULL()
{
static uno::Any aNULLL = uno::makeAny( uno::Reference< uno::XInterface >() );
return aNULLL;
}
void dispatchExecute(SfxViewShell* pViewShell, sal_uInt16 nSlot, SfxCallMode nCall)
{
SfxViewFrame* pViewFrame = NULL;
if ( pViewShell )
pViewFrame = pViewShell->GetViewFrame();
if ( pViewFrame )
{
SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
if( pDispatcher )
{
pDispatcher->Execute( nSlot , nCall );
}
}
}
void
dispatchRequests( const uno::Reference< frame::XModel>& xModel, const rtl::OUString& aUrl, const uno::Sequence< beans::PropertyValue >& sProps )
{
util::URL url;
url.Complete = aUrl;
rtl::OUString emptyString = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "" ));
uno::Reference<frame::XController> xController = xModel->getCurrentController();
uno::Reference<frame::XFrame> xFrame = xController->getFrame();
uno::Reference<frame::XDispatchProvider> xDispatchProvider (xFrame,uno::UNO_QUERY_THROW);
try
{
uno::Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
uno::Reference<uno::XComponentContext > xContext( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW );
if ( !xContext.is() )
return;
uno::Reference<lang::XMultiComponentFactory > xServiceManager = xContext->getServiceManager();
if ( !xServiceManager.is() )
return;
uno::Reference<util::XURLTransformer> xParser( xServiceManager->createInstanceWithContext(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ) ), xContext),
uno::UNO_QUERY_THROW );
if (!xParser.is())
return;
xParser->parseStrict (url);
}
catch ( uno::Exception & /*e*/ )
{
return;
}
uno::Reference<frame::XDispatch> xDispatcher = xDispatchProvider->queryDispatch(url,emptyString,0);
uno::Sequence<beans::PropertyValue> dispatchProps(1);
sal_Int32 nProps = sProps.getLength();
beans::PropertyValue* pDest = dispatchProps.getArray();
if ( nProps )
{
dispatchProps.realloc( nProps + 1 );
// need to reaccquire pDest after realloc
pDest = dispatchProps.getArray();
const beans::PropertyValue* pSrc = sProps.getConstArray();
for ( sal_Int32 index=0; index<nProps; ++index, ++pSrc, ++pDest )
*pDest = *pSrc;
}
(*pDest).Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Silent" ));
(*pDest).Value <<= (sal_Bool)sal_True;
if (xDispatcher.is())
xDispatcher->dispatch( url, dispatchProps );
}
void
dispatchRequests( const uno::Reference< frame::XModel>& xModel, const rtl::OUString& aUrl )
{
uno::Sequence<beans::PropertyValue> dispatchProps;
dispatchRequests( xModel, aUrl, dispatchProps );
}
uno::Reference< frame::XModel >
getCurrentDoc( const rtl::OUString& sKey ) throw (uno::RuntimeException)
{
uno::Reference< frame::XModel > xModel;
SbxObject* pBasic = dynamic_cast< SbxObject* > ( SFX_APP()->GetBasic() );
SbxObject* basicChosen = pBasic ;
if ( basicChosen == NULL)
{
OSL_TRACE("getModelFromBasic() StarBASIC* is NULL" );
return xModel;
}
SbxObject* p = pBasic;
SbxObject* pParent = p->GetParent();
SbxObject* pParentParent = pParent ? pParent->GetParent() : NULL;
if( pParentParent )
{
basicChosen = pParentParent;
}
else if( pParent )
{
basicChosen = pParent;
}
uno::Any aModel;
SbxVariable *pCompVar = basicChosen->Find( sKey, SbxCLASS_OBJECT );
if ( pCompVar )
{
aModel = sbxToUnoValue( pCompVar );
if ( sal_False == ( aModel >>= xModel ) ||
!xModel.is() )
{
throw uno::RuntimeException(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can't extract model from basic ( its obviously not set yet ) therefore don't know the current documet context") ), uno::Reference< uno::XInterface >() );
}
else
{
OSL_TRACE("Have model points to url %s",
::rtl::OUStringToOString( xModel->getURL(),
RTL_TEXTENCODING_ASCII_US ).pData->buffer );
}
}
else
{
OSL_TRACE("Failed to get %s", rtl::OUStringToOString( sKey, RTL_TEXTENCODING_UTF8 ).getStr() );
throw uno::RuntimeException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"Can't determine the currently selected document") ),
uno::Reference< uno::XInterface >() );
}
return xModel;
}
uno::Reference< frame::XModel >
getCurrentDocCtx( const rtl::OUString& ctxName, const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
{
uno::Reference< frame::XModel > xModel;
// try fallback to calling doc
css::uno::Reference< css::container::XNameAccess > xNameAccess( xContext, css::uno::UNO_QUERY_THROW );
xModel.set( xNameAccess->getByName( ctxName ), uno::UNO_QUERY_THROW );
return xModel;
}
uno::Reference< frame::XModel >
getThisExcelDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
{
return getCurrentDocCtx( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ExcelDocumentContext" ) ), xContext );
}
uno::Reference< frame::XModel >
getThisWordDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
{
return getCurrentDocCtx( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WordDocumentContext" ) ), xContext );
}
uno::Reference< frame::XModel >
getCurrentExcelDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
{
static const rtl::OUString sThisExcelDoc( RTL_CONSTASCII_USTRINGPARAM("ThisExcelDoc" ) );
uno::Reference< frame::XModel > xModel;
try
{
xModel = getCurrentDoc( sThisExcelDoc );
}
catch( uno::Exception& e )
{
xModel = getThisExcelDoc( xContext );
}
return xModel;
}
uno::Reference< frame::XModel >
getCurrentWordDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
{
static const rtl::OUString sThisWordDoc( RTL_CONSTASCII_USTRINGPARAM("ThisWordDoc" ) );
uno::Reference< frame::XModel > xModel;
try
{
xModel = getCurrentDoc( sThisWordDoc );
}
catch( uno::Exception& e )
{
xModel = getThisWordDoc( xContext );
}
return xModel;
}
sal_Int32
OORGBToXLRGB( sal_Int32 nCol )
{
sal_Int32 nAutoBits = nCol;
nAutoBits &= 0xFF000000;
sal_Int32 nRed = nCol;
nRed &= 0x00FF0000;
nRed >>= 16;
sal_Int32 nGreen = nCol;
nGreen &= 0x0000FF00;
nGreen >>= 8;
sal_Int32 nBlue = nCol;
nBlue &= 0x000000FF;
sal_Int32 nRGB = ( nAutoBits | (nBlue << 16) | (nGreen << 8) | nRed );
return nRGB;
}
sal_Int32
XLRGBToOORGB( sal_Int32 nCol )
{
sal_Int32 nAutoBits = nCol;
nAutoBits &= 0xFF000000;
sal_Int32 nBlue = nCol;
nBlue &= 0x00FF0000;
nBlue >>= 16;
sal_Int32 nGreen = nCol;
nGreen &= 0x0000FF00;
nGreen >>= 8;
sal_Int32 nRed = nCol;
nRed &= 0x000000FF;
sal_Int32 nRGB = ( nAutoBits | (nRed << 16) | (nGreen << 8) | nBlue );
return nRGB;
}
uno::Any
OORGBToXLRGB( const uno::Any& aCol )
{
sal_Int32 nCol(0);
aCol >>= nCol;
nCol = OORGBToXLRGB( nCol );
return uno::makeAny( nCol );
}
uno::Any
XLRGBToOORGB( const uno::Any& aCol )
{
sal_Int32 nCol(0);
aCol >>= nCol;
nCol = XLRGBToOORGB( nCol );
return uno::makeAny( nCol );
}
void PrintOutHelper( SfxViewShell* pViewShell, const uno::Any& From, const uno::Any& To, const uno::Any& Copies, const uno::Any& Preview, const uno::Any& /*ActivePrinter*/, const uno::Any& /*PrintToFile*/, const uno::Any& Collate, const uno::Any& PrToFileName, sal_Bool bUseSelection )
{
sal_Int32 nTo = 0;
sal_Int32 nFrom = 0;
sal_Int16 nCopies = 1;
sal_Bool bPreview = sal_False;
sal_Bool bCollate = sal_False;
sal_Bool bSelection = bUseSelection;
From >>= nFrom;
To >>= nTo;
Copies >>= nCopies;
Preview >>= bPreview;
if ( nCopies > 1 ) // Collate only useful when more that 1 copy
Collate >>= bCollate;
rtl::OUString sRange( RTL_CONSTASCII_USTRINGPARAM( "-" ) );
rtl::OUString sFileName;
if (( nFrom || nTo ) )
{
if ( nFrom )
sRange = ( ::rtl::OUString::valueOf( nFrom ) + sRange );
if ( nTo )
sRange += ::rtl::OUString::valueOf( nTo );
}
if ( PrToFileName.getValue() )
{
PrToFileName >>= sFileName;
}
SfxViewFrame* pViewFrame = NULL;
if ( pViewShell )
pViewFrame = pViewShell->GetViewFrame();
if ( pViewFrame )
{
SfxAllItemSet aArgs( SFX_APP()->GetPool() );
SfxBoolItem sfxCollate( SID_PRINT_COLLATE, bCollate );
aArgs.Put( sfxCollate, sfxCollate.Which() );
SfxInt16Item sfxCopies( SID_PRINT_COPIES, nCopies );
aArgs.Put( sfxCopies, sfxCopies.Which() );
if ( sFileName.getLength() )
{
SfxStringItem sfxFileName( SID_FILE_NAME, sFileName);
aArgs.Put( sfxFileName, sfxFileName.Which() );
}
if ( sRange.getLength() )
{
SfxStringItem sfxRange( SID_PRINT_PAGES, sRange );
aArgs.Put( sfxRange, sfxRange.Which() );
}
SfxBoolItem sfxSelection( SID_SELECTION, bSelection );
aArgs.Put( sfxSelection, sfxSelection.Which() );
SfxBoolItem sfxAsync( SID_ASYNCHRON, sal_False );
aArgs.Put( sfxAsync, sfxAsync.Which() );
SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
if ( pDispatcher )
{
if ( bPreview )
{
if ( !pViewFrame->GetFrame().IsInPlace() )
{
// #TODO is this necessary ( calc specific )
// SC_MOD()->InputEnterHandler();
pViewFrame->GetDispatcher()->Execute( SID_VIEWSHELL1, SFX_CALLMODE_SYNCHRON );
while ( isInPrintPreview( pViewFrame ) )
Application::Yield();
}
}
else
pDispatcher->Execute( (sal_uInt16)SID_PRINTDOC, (SfxCallMode)SFX_CALLMODE_SYNCHRON, aArgs );
}
}
// #FIXME #TODO
// 1 ActivePrinter ( how/can we switch a printer via API? )
// 2 PrintToFile ( ms behaviour if this option is specified but no
// filename supplied 'PrToFileName' then the user will be prompted )
// 3 Need to check behaviour of Selected sheets with range ( e.g. From & To
// values ) in oOO these options are mutually exclusive
// 4 There is a pop up to do with transparent objects in the print source
// should be able to disable that via configuration for the duration
// of this method
}
void PrintPreviewHelper( const css::uno::Any& /*EnableChanges*/, SfxViewShell* pViewShell )
{
dispatchExecute( pViewShell, SID_VIEWSHELL1 );
}
sal_Int32 extractIntFromAny( const uno::Any& rAny ) throw (uno::RuntimeException)
{
switch( rAny.getValueType().getTypeClass() )
{
case uno::TypeClass_FLOAT:
return static_cast< sal_Int32 >( rAny.get< float >() );
case uno::TypeClass_DOUBLE:
return static_cast< sal_Int32 >( rAny.get< double >() );
case uno::TypeClass_BYTE:
case uno::TypeClass_SHORT:
case uno::TypeClass_LONG:
return rAny.get< sal_Int32 >();
default:;
}
throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid type, cannot convert to integer." ) ), 0 );
}
sal_Int32 extractIntFromAny( const uno::Any& rAny, sal_Int32 nDefault ) throw (uno::RuntimeException)
{
return rAny.hasValue() ? extractIntFromAny( rAny ) : nDefault;
}
bool extractBoolFromAny( const uno::Any& rAny ) throw (uno::RuntimeException)
{
switch( rAny.getValueType().getTypeClass() )
{
case uno::TypeClass_BOOLEAN:
return rAny.get< bool >();
case uno::TypeClass_FLOAT:
return rAny.get< float >() != 0.0;
case uno::TypeClass_DOUBLE:
return rAny.get< double >() != 0.0;
case uno::TypeClass_BYTE:
case uno::TypeClass_SHORT:
case uno::TypeClass_LONG:
return rAny.get< sal_Int32 >() != 0;
case uno::TypeClass_HYPER:
return rAny.get< sal_Int64 >() != 0;
default:;
}
throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid type, cannot convert to boolean." ) ), 0 );
}
bool extractBoolFromAny( const uno::Any& rAny, bool bDefault ) throw (uno::RuntimeException)
{
return rAny.hasValue() ? extractBoolFromAny( rAny ) : bDefault;
}
::rtl::OUString extractStringFromAny( const uno::Any& rAny, bool bUppercaseBool ) throw (uno::RuntimeException)
{
switch( rAny.getValueType().getTypeClass() )
{
case uno::TypeClass_STRING:
return rAny.get< ::rtl::OUString >();
case uno::TypeClass_BOOLEAN:
return bUppercaseBool ?
(rAny.get< bool >() ? ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TRUE" ) ) : ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FALSE" ) )) :
::rtl::OUString::valueOf( (sal_Bool)rAny.get< bool >() );
case uno::TypeClass_FLOAT:
return ::rtl::OUString::valueOf( rAny.get< float >() );
case uno::TypeClass_DOUBLE:
return ::rtl::OUString::valueOf( rAny.get< double >() );
case uno::TypeClass_BYTE:
case uno::TypeClass_SHORT:
case uno::TypeClass_LONG:
return ::rtl::OUString::valueOf( rAny.get< sal_Int32 >() );
case uno::TypeClass_HYPER:
return ::rtl::OUString::valueOf( rAny.get< sal_Int64 >() );
default:;
}
throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid type, cannot convert to string." ) ), 0 );
}
::rtl::OUString extractStringFromAny( const uno::Any& rAny, const ::rtl::OUString& rDefault, bool bUppercaseBool ) throw (uno::RuntimeException)
{
return rAny.hasValue() ? extractStringFromAny( rAny, bUppercaseBool ) : rDefault;
}
rtl::OUString getAnyAsString( const uno::Any& pvargItem ) throw ( uno::RuntimeException )
{
return extractStringFromAny( pvargItem );
}
rtl::OUString
ContainerUtilities::getUniqueName( const uno::Sequence< ::rtl::OUString >& _slist, const rtl::OUString& _sElementName, const ::rtl::OUString& _sSuffixSeparator)
{
return getUniqueName(_slist, _sElementName, _sSuffixSeparator, sal_Int32(2));
}
rtl::OUString
ContainerUtilities::getUniqueName( const uno::Sequence< rtl::OUString >& _slist, const rtl::OUString _sElementName, const rtl::OUString& _sSuffixSeparator, sal_Int32 _nStartSuffix)
{
sal_Int32 a = _nStartSuffix;
rtl::OUString scompname = _sElementName;
bool bElementexists = true;
sal_Int32 nLen = _slist.getLength();
if ( nLen == 0 )
return _sElementName;
while (bElementexists == true)
{
for (sal_Int32 i = 0; i < nLen; i++)
{
if (FieldInList(_slist, scompname) == -1)
{
return scompname;
}
}
scompname = _sElementName + _sSuffixSeparator + rtl::OUString::valueOf( a++ );
}
return rtl::OUString();
}
sal_Int32
ContainerUtilities::FieldInList( const uno::Sequence< rtl::OUString >& SearchList, const rtl::OUString& SearchString )
{
sal_Int32 FieldLen = SearchList.getLength();
sal_Int32 retvalue = -1;
for (sal_Int32 i = 0; i < FieldLen; i++)
{
// I wonder why comparing lexicographically is done
// when its a match is whats interesting?
//if (SearchList[i].compareTo(SearchString) == 0)
if ( SearchList[i].equals( SearchString ) )
{
retvalue = i;
break;
}
}
return retvalue;
}
bool NeedEsc(sal_Unicode cCode)
{
String sEsc(RTL_CONSTASCII_USTRINGPARAM(".^$+\\|{}()"));
return (STRING_NOTFOUND != sEsc.Search(cCode));
}
rtl::OUString VBAToRegexp(const rtl::OUString &rIn, bool bForLike )
{
rtl::OUStringBuffer sResult;
const sal_Unicode *start = rIn.getStr();
const sal_Unicode *end = start + rIn.getLength();
int seenright = 0;
if ( bForLike )
sResult.append(static_cast<sal_Unicode>('^'));
while (start < end)
{
switch (*start)
{
case '?':
sResult.append(static_cast<sal_Unicode>('.'));
start++;
break;
case '*':
sResult.append(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".*")));
start++;
break;
case '#':
sResult.append(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[0-9]")));
start++;
break;
case '~':
sResult.append(static_cast<sal_Unicode>('\\'));
sResult.append(*(++start));
start++;
break;
// dump the ~ and escape the next characture
case ']':
sResult.append(static_cast<sal_Unicode>('\\'));
sResult.append(*start++);
break;
case '[':
sResult.append(*start++);
seenright = 0;
while (start < end && !seenright)
{
switch (*start)
{
case '[':
case '?':
case '*':
sResult.append(static_cast<sal_Unicode>('\\'));
sResult.append(*start);
break;
case ']':
sResult.append(*start);
seenright = 1;
break;
case '!':
sResult.append(static_cast<sal_Unicode>('^'));
break;
default:
if (NeedEsc(*start))
sResult.append(static_cast<sal_Unicode>('\\'));
sResult.append(*start);
break;
}
start++;
}
break;
default:
if (NeedEsc(*start))
sResult.append(static_cast<sal_Unicode>('\\'));
sResult.append(*start++);
}
}
if ( bForLike )
sResult.append(static_cast<sal_Unicode>('$'));
return sResult.makeStringAndClear( );
}
double getPixelTo100thMillimeterConversionFactor( const css::uno::Reference< css::awt::XDevice >& xDevice, sal_Bool bVertical)
{
double fConvertFactor = 1.0;
if( bVertical )
{
fConvertFactor = xDevice->getInfo().PixelPerMeterY/100000;
}
else
{
fConvertFactor = xDevice->getInfo().PixelPerMeterX/100000;
}
return fConvertFactor;
}
double PointsToPixels( const css::uno::Reference< css::awt::XDevice >& xDevice, double fPoints, sal_Bool bVertical)
{
double fConvertFactor = getPixelTo100thMillimeterConversionFactor( xDevice, bVertical );
return PointsToHmm( fPoints ) * fConvertFactor;
}
double PixelsToPoints( const css::uno::Reference< css::awt::XDevice >& xDevice, double fPixels, sal_Bool bVertical)
{
double fConvertFactor = getPixelTo100thMillimeterConversionFactor( xDevice, bVertical );
return HmmToPoints( fPixels/fConvertFactor );
}
sal_Int32 PointsToHmm( double fPoints )
{
return static_cast<sal_Int32>( fPoints * factor + 0.5 );
}
double HmmToPoints( sal_Int32 nHmm )
{
return nHmm / factor;
}
ConcreteXShapeGeometryAttributes::ConcreteXShapeGeometryAttributes( const css::uno::Reference< css::uno::XComponentContext >& /*xContext*/, const css::uno::Reference< css::drawing::XShape >& xShape )
{
m_pShapeHelper.reset( new ShapeHelper( xShape ) );
}
ConcreteXShapeGeometryAttributes::~ConcreteXShapeGeometryAttributes()
{
}
sal_Int32 getPointerStyle( const uno::Reference< frame::XModel >& xModel )
{
sal_Int32 nPointerStyle( POINTER_ARROW );
try
{
const uno::Reference< frame::XController > xController( xModel->getCurrentController(), uno::UNO_SET_THROW );
const uno::Reference< frame::XFrame > xFrame ( xController->getFrame(), uno::UNO_SET_THROW );
const uno::Reference< awt::XWindow > xWindow ( xFrame->getContainerWindow(), uno::UNO_SET_THROW );
// why the heck isn't there an XWindowPeer::getPointer, but a setPointer only?
const Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
if ( pWindow )
nPointerStyle = pWindow->GetSystemWindow()->GetPointer().GetStyle();
}
catch( const uno::Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return nPointerStyle;
}
// #FIXME this method looks wrong, shouldn't it just affect calc *or* writer
// document/frame/window(s) but not both ( and depending on what api called
// this )
void setCursorHelper( const uno::Reference< frame::XModel >& xModel, const Pointer& rPointer, sal_Bool bOverWrite )
{
::std::vector< uno::Reference< frame::XController > > aControllers;
uno::Reference< frame::XModel2 > xModel2( xModel, uno::UNO_QUERY );
if ( xModel2.is() )
{
const uno::Reference< container::XEnumeration > xEnumControllers( xModel2->getControllers(), uno::UNO_SET_THROW );
while ( xEnumControllers->hasMoreElements() )
{
const uno::Reference< frame::XController > xController( xEnumControllers->nextElement(), uno::UNO_QUERY_THROW );
aControllers.push_back( xController );
}
}
else
{
if ( xModel.is() )
{
const uno::Reference< frame::XController > xController( xModel->getCurrentController(), uno::UNO_SET_THROW );
aControllers.push_back( xController );
}
}
for ( ::std::vector< uno::Reference< frame::XController > >::const_iterator controller = aControllers.begin();
controller != aControllers.end();
++controller
)
{
const uno::Reference< frame::XFrame > xFrame ( (*controller)->getFrame(), uno::UNO_SET_THROW );
const uno::Reference< awt::XWindow > xWindow ( xFrame->getContainerWindow(), uno::UNO_SET_THROW );
Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
OSL_ENSURE( pWindow, "ScVbaApplication::setCursor: no window!" );
if ( !pWindow )
continue;
pWindow->GetSystemWindow()->SetPointer( rPointer );
pWindow->GetSystemWindow()->EnableChildPointerOverwrite( bOverWrite );
}
}
void setDefaultPropByIntrospection( const uno::Any& aObj, const uno::Any& aValue ) throw ( uno::RuntimeException )
{
uno::Reference< beans::XIntrospectionAccess > xUnoAccess( getIntrospectionAccess( aObj ) );
// #MAYBE #FIXME sort of a bit of a hack,
uno::Reference< script::XDefaultProperty > xDflt( aObj, uno::UNO_QUERY_THROW );
uno::Reference< beans::XPropertySet > xPropSet;
if ( xUnoAccess.is() )
xPropSet.set( xUnoAccess->queryAdapter( ::getCppuType( (const uno::Reference< beans::XPropertySet > *)0 ) ), uno::UNO_QUERY);
if ( xPropSet.is() )
xPropSet->setPropertyValue( xDflt->getDefaultPropertyName(), aValue );
else
throw uno::RuntimeException();
}
uno::Any getPropertyValue( const uno::Sequence< beans::PropertyValue >& aProp, const rtl::OUString& aName )
{
uno::Any result;
for ( sal_Int32 i = 0; i < aProp.getLength(); i++ )
{
if ( aProp[i].Name.equals(aName) )
{
aProp[i].Value >>= result;
return result;
}
}
return result;
}
sal_Bool setPropertyValue( uno::Sequence< beans::PropertyValue >& aProp, const rtl::OUString& aName, const uno::Any& aValue )
{
for ( sal_Int32 i = 0; i < aProp.getLength(); i++ )
{
if ( aProp[i].Name.equals(aName) )
{
aProp[i].Value = aValue;
return sal_True;
}
}
return sal_False;
}
// ====UserFormGeomentryHelper====
//---------------------------------------------
UserFormGeometryHelper::UserFormGeometryHelper(
const uno::Reference< uno::XComponentContext >& /*xContext*/,
const uno::Reference< awt::XControl >& xControl,
double fOffsetX, double fOffsetY ) :
mfOffsetX( fOffsetX ),
mfOffsetY( fOffsetY ),
mbDialog( uno::Reference< awt::XDialog >( xControl, uno::UNO_QUERY ).is() )
{
if ( !xControl.is() )
throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No control is provided!" ) ),
uno::Reference< uno::XInterface >() );
mxWindow.set( xControl->getPeer(), uno::UNO_QUERY_THROW );
mxModelProps.set( xControl->getModel(), uno::UNO_QUERY_THROW );
mxUnitConv.set( mxWindow, uno::UNO_QUERY_THROW );
}
double UserFormGeometryHelper::getLeft() const
{
return implGetPos( false );
}
void UserFormGeometryHelper::setLeft( double fLeft )
{
implSetPos( fLeft, false );
}
double UserFormGeometryHelper::getTop() const
{
return implGetPos( true );
}
void UserFormGeometryHelper::setTop( double fTop )
{
implSetPos( fTop, true );
}
double UserFormGeometryHelper::getWidth() const
{
return implGetSize( false, true );
}
void UserFormGeometryHelper::setWidth( double fWidth )
{
implSetSize( fWidth, false, true );
}
double UserFormGeometryHelper::getHeight() const
{
return implGetSize( true, true );
}
void UserFormGeometryHelper::setHeight( double fHeight )
{
implSetSize( fHeight, true, true );
}
double UserFormGeometryHelper::getInnerWidth() const
{
return implGetSize( false, false );
}
void UserFormGeometryHelper::setInnerWidth( double fWidth )
{
implSetSize( fWidth, false, false );
}
double UserFormGeometryHelper::getInnerHeight() const
{
return implGetSize( true, false );
}
void UserFormGeometryHelper::setInnerHeight( double fHeight )
{
implSetSize( fHeight, true, false );
}
double UserFormGeometryHelper::getOffsetX() const
{
return mfOffsetX;
}
double UserFormGeometryHelper::getOffsetY() const
{
return mfOffsetY;
}
// ----------------------------------------------------------------------------
static const ::rtl::OUString saPosXName( RTL_CONSTASCII_USTRINGPARAM( "PositionX" ) );
static const ::rtl::OUString saPosYName( RTL_CONSTASCII_USTRINGPARAM( "PositionY" ) );
static const ::rtl::OUString saWidthName( RTL_CONSTASCII_USTRINGPARAM( "Width" ) );
static const ::rtl::OUString saHeightName( RTL_CONSTASCII_USTRINGPARAM( "Height" ) );
double UserFormGeometryHelper::implGetPos( bool bPosY ) const
{
sal_Int32 nPosAppFont = mxModelProps->getPropertyValue( bPosY ? saPosYName : saPosXName ).get< sal_Int32 >();
// appfont to pixel
awt::Point aPosPixel = mxUnitConv->convertPointToPixel( awt::Point( nPosAppFont, nPosAppFont ), util::MeasureUnit::APPFONT );
// pixel to VBA points
awt::Point aPosPoint = mxUnitConv->convertPointToLogic( aPosPixel, util::MeasureUnit::POINT );
return bPosY ? (aPosPoint.Y - mfOffsetY) : (aPosPoint.X - mfOffsetX);
}
void UserFormGeometryHelper::implSetPos( double fPos, bool bPosY )
{
// convert passed VBA points to pixels
sal_Int32 nPosPixel = static_cast< sal_Int32 >( fPos + (bPosY ? mfOffsetY : mfOffsetX) );
awt::Point aPosPixel = mxUnitConv->convertPointToPixel( awt::Point( nPosPixel, nPosPixel ), util::MeasureUnit::POINT );
// pixel to appfont
awt::Point aPosAppFont = mxUnitConv->convertPointToLogic( aPosPixel, util::MeasureUnit::APPFONT );
mxModelProps->setPropertyValue( bPosY ? saPosYName : saPosXName, uno::Any( bPosY ? aPosAppFont.Y : aPosAppFont.X ) );
}
double UserFormGeometryHelper::implGetSize( bool bHeight, bool bOuter ) const
{
sal_Int32 nSizeAppFont = mxModelProps->getPropertyValue( bHeight ? saHeightName : saWidthName ).get< sal_Int32 >();
// appfont to pixel
awt::Size aSizePixel = mxUnitConv->convertSizeToPixel( awt::Size( nSizeAppFont, nSizeAppFont ), util::MeasureUnit::APPFONT );
/* The VBA symbols 'Width' and 'Height' return the outer size including
window decoration (in difference to the symbols 'InnerWidth' and
'InnerHeight'), but the window API returns the inner size. */
if( mbDialog && bOuter )
{
if( const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ) )
{
Rectangle aOuterRect = pWindow->GetWindowExtentsRelative( NULL );
aSizePixel = awt::Size( aOuterRect.getWidth(), aOuterRect.getHeight() );
}
}
// pixel to VBA points
awt::Size aSizePoint = mxUnitConv->convertSizeToLogic( aSizePixel, util::MeasureUnit::POINT );
return bHeight ? aSizePoint.Height : aSizePoint.Width;
}
void UserFormGeometryHelper::implSetSize( double fSize, bool bHeight, bool bOuter )
{
// convert passed VBA points to pixels
sal_Int32 nSize = static_cast< sal_Int32 >( fSize );
awt::Size aSizePixel = mxUnitConv->convertSizeToPixel( awt::Size( nSize, nSize ), util::MeasureUnit::POINT );
/* The VBA symbols 'Width' and 'Height' set the outer size (in difference
to the symbols 'InnerWidth' and 'InnerHeight'), but the dialog model
expects the inner size. We have to remove the window extents from the
pixel height to get the same result. */
if ( mbDialog && bOuter )
{
if( const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ) )
{
Rectangle aOuterRect = pWindow->GetWindowExtentsRelative( NULL );
if( !aOuterRect.IsEmpty() )
{
awt::Rectangle aInnerRect = mxWindow->getPosSize();
sal_Int32 nDecorWidth = aOuterRect.getWidth() - aInnerRect.Width;
sal_Int32 nDecorHeight = aOuterRect.getHeight() - aInnerRect.Height;
aSizePixel.Width = ::std::max< sal_Int32 >( aSizePixel.Width - nDecorWidth, 1 );
aSizePixel.Height = ::std::max< sal_Int32 >( aSizePixel.Height - nDecorHeight, 1 );
}
}
}
awt::Size aSizeAppFont = mxUnitConv->convertSizeToLogic( aSizePixel, util::MeasureUnit::APPFONT );
mxModelProps->setPropertyValue( bHeight ? saHeightName : saWidthName, uno::Any( bHeight ? aSizeAppFont.Height : aSizeAppFont.Width ) );
}
// ============================================================================
double ConcreteXShapeGeometryAttributes::getLeft() const
{
return m_pShapeHelper->getLeft();
}
void ConcreteXShapeGeometryAttributes::setLeft( double nLeft )
{
m_pShapeHelper->setLeft( nLeft );
}
double ConcreteXShapeGeometryAttributes::getTop() const
{
return m_pShapeHelper->getTop();
}
void ConcreteXShapeGeometryAttributes::setTop( double nTop )
{
m_pShapeHelper->setTop( nTop );
}
double ConcreteXShapeGeometryAttributes::getHeight() const
{
return m_pShapeHelper->getHeight();
}
void ConcreteXShapeGeometryAttributes::setHeight( double nHeight )
{
m_pShapeHelper->setHeight( nHeight );
}
double ConcreteXShapeGeometryAttributes::getWidth() const
{
return m_pShapeHelper->getWidth();
}
void ConcreteXShapeGeometryAttributes::setWidth( double nWidth)
{
m_pShapeHelper->setWidth( nWidth );
}
ShapeHelper::ShapeHelper( const css::uno::Reference< css::drawing::XShape >& _xShape) throw (css::script::BasicErrorException ) : xShape( _xShape )
{
if( !xShape.is() )
throw css::uno::RuntimeException( rtl::OUString::createFromAscii("No valid shape for helper"), css::uno::Reference< css::uno::XInterface >() );
}
double ShapeHelper::getHeight() const
{
return Millimeter::getInPoints(xShape->getSize().Height);
}
void ShapeHelper::setHeight(double _fheight) throw ( css::script::BasicErrorException )
{
try
{
css::awt::Size aSize = xShape->getSize();
aSize.Height = Millimeter::getInHundredthsOfOneMillimeter(_fheight);
xShape->setSize(aSize);
}
catch ( css::uno::Exception& /*e*/)
{
throw css::script::BasicErrorException( rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
double ShapeHelper::getWidth() const
{
return Millimeter::getInPoints(xShape->getSize().Width);
}
void ShapeHelper::setWidth(double _fWidth) throw ( css::script::BasicErrorException )
{
try
{
css::awt::Size aSize = xShape->getSize();
aSize.Width = Millimeter::getInHundredthsOfOneMillimeter(_fWidth);
xShape->setSize(aSize);
}
catch (css::uno::Exception& /*e*/)
{
throw css::script::BasicErrorException( rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
}
}
double ShapeHelper::getLeft() const
{
return Millimeter::getInPoints(xShape->getPosition().X);
}
void ShapeHelper::setLeft(double _fLeft)
{
css::awt::Point aPoint = xShape->getPosition();
aPoint.X = Millimeter::getInHundredthsOfOneMillimeter(_fLeft);
xShape->setPosition(aPoint);
}
double ShapeHelper::getTop() const
{
return Millimeter::getInPoints(xShape->getPosition().Y);
}
void ShapeHelper::setTop(double _fTop)
{
css::awt::Point aPoint = xShape->getPosition();
aPoint.Y = Millimeter::getInHundredthsOfOneMillimeter(_fTop);
xShape->setPosition(aPoint);
}
void DebugHelper::exception( const rtl::OUString& DetailedMessage, const css::uno::Exception& ex, int err, const rtl::OUString& /*additionalArgument*/ ) throw( css::script::BasicErrorException )
{
// #TODO #FIXME ( do we want to support additionalArg here )
throw css::script::BasicErrorException( DetailedMessage.concat( rtl::OUString::createFromAscii(" ") ).concat( ex.Message ), css::uno::Reference< css::uno::XInterface >(), err, rtl::OUString() );
}
void DebugHelper::exception( int err, const rtl::OUString& additionalArgument ) throw( css::script::BasicErrorException )
{
exception( rtl::OUString(), css::uno::Exception(), err, additionalArgument );
}
void DebugHelper::exception( css::uno::Exception& ex ) throw( css::script::BasicErrorException )
{
exception( rtl::OUString(), ex, SbERR_INTERNAL_ERROR, rtl::OUString() );
}
Millimeter::Millimeter():m_nMillimeter(0) {}
Millimeter::Millimeter(double mm):m_nMillimeter(mm) {}
void Millimeter::set(double mm) { m_nMillimeter = mm; }
void Millimeter::setInPoints(double points)
{
m_nMillimeter = points * factor / 100.0;
}
void Millimeter::setInHundredthsOfOneMillimeter(double hmm)
{
m_nMillimeter = hmm / 100;
}
double Millimeter::get()
{
return m_nMillimeter;
}
double Millimeter::getInHundredthsOfOneMillimeter()
{
return m_nMillimeter * 100;
}
double Millimeter::getInPoints()
{
return m_nMillimeter / factor * 100.0;
}
sal_Int32 Millimeter::getInHundredthsOfOneMillimeter(double points)
{
sal_Int32 mm = static_cast<sal_Int32>(points * factor);
return mm;
}
double Millimeter::getInPoints(int _hmm)
{
double points = double( static_cast<double>(_hmm) / factor);
return points;
}
uno::Reference< XHelperInterface > getVBADocument( const uno::Reference< frame::XModel >& xModel )
{
uno::Reference< XHelperInterface > xIf;
try
{
uno::Reference< beans::XPropertySet > xDocProps( xModel, uno::UNO_QUERY_THROW );
::rtl::OUString aCodeName;
xDocProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CodeName" ) ) ) >>= aCodeName;
xIf = getUnoDocModule( aCodeName, getSfxObjShell( xModel ) );
}
catch( uno::Exception& )
{
}
return xIf;
}
uno::Reference< XHelperInterface > getUnoDocModule( const String& aModName, SfxObjectShell* pShell )
{
uno::Reference< XHelperInterface > xIf;
if ( pShell )
{
rtl::OUString sProj( RTL_CONSTASCII_USTRINGPARAM("Standard") );
BasicManager* pBasMgr = pShell->GetBasicManager();
if ( pBasMgr && pBasMgr->GetName().Len() )
sProj = pBasMgr->GetName();
if( StarBASIC* pBasic = pShell->GetBasicManager()->GetLib( sProj ) )
if( SbModule* pMod = pBasic->FindModule( aModName ) )
xIf.set( pMod->GetUnoModule(), uno::UNO_QUERY );
}
return xIf;
}
SfxObjectShell* getSfxObjShell( const uno::Reference< frame::XModel >& xModel ) throw (uno::RuntimeException)
{
SfxObjectShell* pFoundShell = NULL;
if ( xModel.is() )
{
uno::Reference< lang::XUnoTunnel > xObjShellTunnel( xModel, uno::UNO_QUERY_THROW );
pFoundShell = reinterpret_cast<SfxObjectShell*>( xObjShellTunnel->getSomething(SfxObjectShell::getUnoTunnelId()));
}
if ( !pFoundShell )
throw uno::RuntimeException();
return pFoundShell;
}
} // openoffice
} //org