2010-10-12 15:59:00 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2009-09-18 15:35:47 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2009-09-18 15:35:47 +00:00
*
* 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 .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-09-17 18:42:00 +02:00
2009-09-18 15:35:47 +00:00
# include "excelvbahelper.hxx"
2010-09-17 18:42:00 +02:00
# include <comphelper/processfactory.hxx>
# include <com/sun/star/sheet/XSheetCellRange.hpp>
# include "docuno.hxx"
2009-09-18 15:35:47 +00:00
# include "tabvwsh.hxx"
# include "transobj.hxx"
# include "scmod.hxx"
# include "cellsuno.hxx"
2010-10-06 10:15:43 +01:00
# include "compiler.hxx"
# include "token.hxx"
# include "tokenarray.hxx"
2009-09-18 15:35:47 +00:00
# include <comphelper/processfactory.hxx>
2010-07-01 16:23:26 +02:00
# include <com/sun/star/sheet/XSheetCellRange.hpp>
2009-09-18 15:35:47 +00:00
using namespace : : com : : sun : : star ;
using namespace : : ooo : : vba ;
2010-09-17 18:42:00 +02:00
// ============================================================================
2010-07-01 16:23:26 +02:00
2010-10-06 10:15:43 +01:00
uno : : Reference < sheet : : XDatabaseRanges >
GetDataBaseRanges ( ScDocShell * pShell ) throw ( uno : : RuntimeException )
{
uno : : Reference < frame : : XModel > xModel ;
if ( pShell )
xModel . set ( pShell - > GetModel ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < beans : : XPropertySet > xModelProps ( xModel , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < sheet : : XDatabaseRanges > xDBRanges ( xModelProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " DatabaseRanges " ) ) ) , uno : : UNO_QUERY_THROW ) ;
return xDBRanges ;
}
// returns the XDatabaseRange for the autofilter on sheet (nSheet)
// also populates sName with the name of range
uno : : Reference < sheet : : XDatabaseRange >
GetAutoFiltRange ( ScDocShell * pShell , sal_Int16 nSheet , rtl : : OUString & sName ) throw ( uno : : RuntimeException )
{
uno : : Reference < container : : XIndexAccess > xIndexAccess ( GetDataBaseRanges ( pShell ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < sheet : : XDatabaseRange > xDataBaseRange ;
table : : CellRangeAddress dbAddress ;
for ( sal_Int32 index = 0 ; index < xIndexAccess - > getCount ( ) ; + + index )
{
uno : : Reference < sheet : : XDatabaseRange > xDBRange ( xIndexAccess - > getByIndex ( index ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < container : : XNamed > xNamed ( xDBRange , uno : : UNO_QUERY_THROW ) ;
// autofilters work weirdly with openoffice, unnamed is the default
// named range which is used to create an autofilter, but
// its also possible that another name could be used
// this also causes problems when an autofilter is created on
// another sheet
// ( but.. you can use any named range )
dbAddress = xDBRange - > getDataArea ( ) ;
if ( dbAddress . Sheet = = nSheet )
{
2011-03-10 16:55:21 -05:00
sal_Bool bHasAuto = false ;
2010-10-06 10:15:43 +01:00
uno : : Reference < beans : : XPropertySet > xProps ( xDBRange , uno : : UNO_QUERY_THROW ) ;
xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " AutoFilter " ) ) ) > > = bHasAuto ;
if ( bHasAuto )
{
sName = xNamed - > getName ( ) ;
xDataBaseRange = xDBRange ;
break ;
}
}
}
return xDataBaseRange ;
}
2010-07-01 16:23:26 +02:00
ScDocShell * GetDocShellFromRange ( const uno : : Reference < uno : : XInterface > & xRange ) throw ( uno : : RuntimeException )
{
ScCellRangesBase * pScCellRangesBase = ScCellRangesBase : : getImplementation ( xRange ) ;
if ( ! pScCellRangesBase )
{
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Failed to access underlying doc shell uno range object " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
}
return pScCellRangesBase - > GetDocShell ( ) ;
}
2010-10-06 10:15:43 +01:00
ScDocShell * GetDocShellFromRanges ( const uno : : Reference < sheet : : XSheetCellRangeContainer > & xRanges ) throw ( uno : : RuntimeException )
{
// need the ScCellRangesBase to get docshell
uno : : Reference < uno : : XInterface > xIf ( xRanges , uno : : UNO_QUERY_THROW ) ;
return GetDocShellFromRange ( xIf ) ;
}
2010-07-01 16:23:26 +02:00
ScDocument * GetDocumentFromRange ( const uno : : Reference < uno : : XInterface > & xRange ) throw ( uno : : RuntimeException )
{
ScDocShell * pDocShell = GetDocShellFromRange ( xRange ) ;
if ( ! pDocShell )
{
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Failed to access underlying document from uno range object " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
}
return pDocShell - > GetDocument ( ) ;
}
2010-10-06 10:15:43 +01:00
uno : : Reference < frame : : XModel > GetModelFromRange ( const uno : : Reference < uno : : XInterface > & xRange ) throw ( uno : : RuntimeException )
{
ScDocShell * pDocShell = GetDocShellFromRange ( xRange ) ;
if ( ! pDocShell )
{
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Failed to access underlying model uno range object " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
}
return pDocShell - > GetModel ( ) ;
}
2009-09-18 15:35:47 +00:00
void implSetZoom ( const uno : : Reference < frame : : XModel > & xModel , sal_Int16 nZoom , std : : vector < SCTAB > & nTabs )
{
ScTabViewShell * pViewSh = excel : : getBestViewShell ( xModel ) ;
Fraction aFract ( nZoom , 100 ) ;
pViewSh - > GetViewData ( ) - > SetZoom ( aFract , aFract , nTabs ) ;
pViewSh - > RefreshZoom ( ) ;
}
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 ;
}
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 )
{
2011-03-10 16:55:21 -05:00
sal_Bool res = false ;
2009-09-18 15:35:47 +00:00
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 ( const uno : : Reference < frame : : XModel > & xModel )
{
PasteCellsWarningReseter resetWarningBox ;
ScTabViewShell * pViewShell = getBestViewShell ( xModel ) ;
if ( pViewShell )
{
pViewShell - > PasteFromSystem ( ) ;
pViewShell - > CellContentChanged ( ) ;
}
}
void
implnCopy ( const uno : : Reference < frame : : XModel > & xModel )
{
ScTabViewShell * pViewShell = getBestViewShell ( xModel ) ;
if ( pViewShell )
2010-09-15 18:01:02 +02:00
{
2009-09-18 15:35:47 +00:00
pViewShell - > CopyToClip ( NULL , false , false , true ) ;
2010-09-15 18:01:02 +02:00
// mark the copied transfer object so it is used in ScVbaRange::Insert
ScTransferObj * pClipObj = ScTransferObj : : GetOwnClipboard ( NULL ) ;
if ( pClipObj )
pClipObj - > SetUseInApi ( true ) ;
}
2009-09-18 15:35:47 +00:00
}
void
implnCut ( const uno : : Reference < frame : : XModel > & xModel )
{
ScTabViewShell * pViewShell = getBestViewShell ( xModel ) ;
if ( pViewShell )
2010-09-15 18:01:02 +02:00
{
2011-01-17 13:20:22 +01:00
pViewShell - > CutToClip ( NULL , sal_True ) ;
2010-09-15 18:01:02 +02:00
// mark the copied transfer object so it is used in ScVbaRange::Insert
ScTransferObj * pClipObj = ScTransferObj : : GetOwnClipboard ( NULL ) ;
if ( pClipObj )
pClipObj - > SetUseInApi ( true ) ;
}
2009-09-18 15:35:47 +00:00
}
2011-01-17 13:20:22 +01:00
void implnPasteSpecial ( const uno : : Reference < frame : : XModel > & xModel , sal_uInt16 nFlags , sal_uInt16 nFunction , sal_Bool bSkipEmpty , sal_Bool bTranspose )
2009-09-18 15:35:47 +00:00
{
PasteCellsWarningReseter resetWarningBox ;
2011-03-10 16:55:21 -05:00
sal_Bool bAsLink ( false ) , bOtherDoc ( false ) ;
2009-09-18 15:35:47 +00:00
InsCellCmd eMoveMode = INS_NONE ;
ScTabViewShell * pTabViewShell = getBestViewShell ( xModel ) ;
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 ,
2011-01-17 13:20:22 +01:00
eMoveMode , IDF_NONE , sal_True ) ;
2009-09-18 15:35:47 +00:00
pTabViewShell - > CellContentChanged ( ) ;
}
}
}
}
2010-10-06 10:15:43 +01:00
void implnCopyRange ( const uno : : Reference < frame : : XModel > & xModel , const ScRange & rRange )
{
ScTabViewShell * pViewShell = getBestViewShell ( xModel ) ;
if ( pViewShell )
{
2011-03-10 16:55:21 -05:00
pViewShell - > CopyToClip ( NULL , rRange , false , true , true ) ;
2010-10-06 10:15:43 +01:00
}
}
2009-09-18 15:35:47 +00:00
ScDocShell *
getDocShell ( const 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 ( const css : : uno : : Reference < css : : frame : : XModel > & xModel )
{
ScDocShell * pDocShell = getDocShell ( xModel ) ;
if ( pDocShell )
return pDocShell - > GetBestViewShell ( ) ;
return NULL ;
}
ScTabViewShell *
getCurrentBestViewShell ( const uno : : Reference < uno : : XComponentContext > & xContext )
{
uno : : Reference < frame : : XModel > xModel = getCurrentExcelDoc ( xContext ) ;
return getBestViewShell ( xModel ) ;
}
SfxViewFrame *
getViewFrame ( const uno : : Reference < frame : : XModel > & xModel )
{
ScTabViewShell * pViewShell = getBestViewShell ( xModel ) ;
if ( pViewShell )
return pViewShell - > GetViewFrame ( ) ;
return NULL ;
}
2010-10-06 10:15:43 +01:00
sal_Bool IsR1C1ReferFormat ( ScDocument * pDoc , const rtl : : OUString & sRangeStr )
{
ScRangeList aCellRanges ;
String sAddress ( sRangeStr ) ;
2011-03-10 16:55:21 -05:00
sal_uInt16 nMask = SCA_VALID ;
sal_uInt16 rResFlags = aCellRanges . Parse ( sAddress , pDoc , nMask , formula : : FormulaGrammar : : CONV_XL_R1C1 ) ;
2010-10-06 10:15:43 +01:00
if ( rResFlags & SCA_VALID )
{
return sal_True ;
}
2011-03-10 16:55:21 -05:00
return false ;
2010-10-06 10:15:43 +01:00
}
2010-07-01 16:23:26 +02:00
uno : : Reference < XHelperInterface >
getUnoSheetModuleObj ( const uno : : Reference < table : : XCellRange > & xRange ) throw ( uno : : RuntimeException )
{
2010-09-17 18:42:00 +02:00
uno : : Reference < beans : : XPropertySet > xProps ( xSheet , uno : : UNO_QUERY_THROW ) ;
2010-07-01 16:23:26 +02:00
rtl : : OUString sCodeName ;
xProps - > getPropertyValue ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " CodeName " ) ) ) > > = sCodeName ;
// #TODO #FIXME ideally we should 'throw' here if we don't get a valid parent, but... it is possible
// to create a module ( and use 'Option VBASupport 1' ) for a calc document, in this scenario there
// are *NO* special document module objects ( of course being able to switch between vba/non vba mode at
// the document in the future could fix this, especially IF the switching of the vba mode takes care to
// create the special document module objects if they don't exist.
2010-09-17 18:42:00 +02:00
uno : : Reference < XHelperInterface > xParent ( ov : : getUnoDocModule ( sCodeName , GetDocShellFromRange ( xSheet ) ) , uno : : UNO_QUERY ) ;
2010-07-01 16:23:26 +02:00
return xParent ;
}
2010-10-06 10:15:43 +01:00
formula : : FormulaGrammar : : Grammar GetFormulaGrammar ( ScDocument * pDoc , const ScAddress & sAddress , const css : : uno : : Any & aFormula )
{
formula : : FormulaGrammar : : Grammar eGrammar = formula : : FormulaGrammar : : GRAM_NATIVE_XL_A1 ;
if ( pDoc & & aFormula . hasValue ( ) & & aFormula . getValueTypeClass ( ) = = uno : : TypeClass_STRING )
{
rtl : : OUString sFormula ;
aFormula > > = sFormula ;
ScCompiler aCompiler ( pDoc , sAddress ) ;
aCompiler . SetGrammar ( formula : : FormulaGrammar : : GRAM_NATIVE_XL_R1C1 ) ;
ScTokenArray * pCode = aCompiler . CompileString ( sFormula ) ;
if ( pCode )
{
2011-03-10 16:55:21 -05:00
sal_uInt16 nLen = pCode - > GetLen ( ) ;
2010-10-06 10:15:43 +01:00
formula : : FormulaToken * * pTokens = pCode - > GetArray ( ) ;
2011-03-10 16:55:21 -05:00
for ( sal_uInt16 nPos = 0 ; nPos < nLen ; nPos + + )
2010-10-06 10:15:43 +01:00
{
const formula : : FormulaToken & rToken = * pTokens [ nPos ] ;
switch ( rToken . GetType ( ) )
{
case formula : : svSingleRef :
case formula : : svDoubleRef :
{
return formula : : FormulaGrammar : : GRAM_NATIVE_XL_R1C1 ;
}
break ;
default : break ;
}
}
}
}
return eGrammar ;
}
void CompileExcelFormulaToODF ( ScDocument * pDoc , const String & rOldFormula , String & rNewFormula )
{
if ( ! pDoc )
{
return ;
}
ScCompiler aCompiler ( pDoc , ScAddress ( ) ) ;
aCompiler . SetGrammar ( excel : : GetFormulaGrammar ( pDoc , ScAddress ( ) , uno : : Any ( rtl : : OUString ( rOldFormula ) ) ) ) ;
2010-11-08 20:39:11 +01:00
aCompiler . CompileString ( rOldFormula ) ;
2010-10-06 10:15:43 +01:00
aCompiler . SetGrammar ( formula : : FormulaGrammar : : GRAM_PODF_A1 ) ;
aCompiler . CreateStringFromTokenArray ( rNewFormula ) ;
}
void CompileODFFormulaToExcel ( ScDocument * pDoc , const String & rOldFormula , String & rNewFormula , const formula : : FormulaGrammar : : Grammar eGrammar )
{
// eGrammar can be formula::FormulaGrammar::GRAM_NATIVE_XL_R1C1 and formula::FormulaGrammar::GRAM_NATIVE_XL_A1
if ( ! pDoc )
{
return ;
}
ScCompiler aCompiler ( pDoc , ScAddress ( ) ) ;
aCompiler . SetGrammar ( formula : : FormulaGrammar : : GRAM_PODF_A1 ) ;
ScTokenArray * pCode = aCompiler . CompileString ( rOldFormula ) ;
aCompiler . SetGrammar ( eGrammar ) ;
if ( ! pCode )
{
return ;
}
2011-03-10 16:55:21 -05:00
sal_uInt16 nLen = pCode - > GetLen ( ) ;
2010-10-06 10:15:43 +01:00
formula : : FormulaToken * * pTokens = pCode - > GetArray ( ) ;
2011-03-10 16:55:21 -05:00
for ( sal_uInt16 nPos = 0 ; nPos < nLen & & pTokens [ nPos ] ; nPos + + )
2010-10-06 10:15:43 +01:00
{
String rFormula ;
formula : : FormulaToken * pToken = pTokens [ nPos ] ;
2011-03-10 16:55:21 -05:00
aCompiler . CreateStringFromToken ( rFormula , pToken , true ) ;
2010-10-06 10:15:43 +01:00
if ( pToken - > GetOpCode ( ) = = ocSep )
{
// Excel formula separator is ",".
rFormula = String : : CreateFromAscii ( " , " ) ;
}
rNewFormula + = rFormula ;
}
}
2010-07-01 16:23:26 +02:00
uno : : Reference < XHelperInterface >
getUnoSheetModuleObj ( const uno : : Reference < sheet : : XSheetCellRangeContainer > & xRanges ) throw ( uno : : RuntimeException )
{
uno : : Reference < container : : XEnumerationAccess > xEnumAccess ( xRanges , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < container : : XEnumeration > xEnum = xEnumAccess - > createEnumeration ( ) ;
uno : : Reference < table : : XCellRange > xRange ( xEnum - > nextElement ( ) , uno : : UNO_QUERY_THROW ) ;
return getUnoSheetModuleObj ( xRange ) ;
}
2010-09-17 18:42:00 +02:00
uno : : Reference < XHelperInterface >
getUnoSheetModuleObj ( const uno : : Reference < table : : XCell > & xCell ) throw ( uno : : RuntimeException )
{
uno : : Reference < sheet : : XSheetCellRange > xSheetRange ( xCell , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < sheet : : XSpreadsheet > xSheet ( xSheetRange - > getSpreadsheet ( ) , uno : : UNO_SET_THROW ) ;
return getUnoSheetModuleObj ( xSheet ) ;
}
uno : : Reference < XHelperInterface >
getUnoSheetModuleObj ( const uno : : Reference < frame : : XModel > & xModel , SCTAB nTab ) throw ( uno : : RuntimeException )
{
uno : : Reference < sheet : : XSpreadsheetDocument > xDoc ( xModel , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < container : : XIndexAccess > xSheets ( xDoc - > getSheets ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < sheet : : XSpreadsheet > xSheet ( xSheets - > getByIndex ( nTab ) , uno : : UNO_QUERY_THROW ) ;
return getUnoSheetModuleObj ( xSheet ) ;
}
2009-09-18 15:35:47 +00:00
SfxItemSet *
2010-04-13 19:44:24 +01:00
ScVbaCellRangeAccess : : GetDataSet ( ScCellRangesBase * pRangeObj )
2009-09-18 15:35:47 +00:00
{
2010-04-13 19:44:24 +01:00
return pRangeObj ? pRangeObj - > GetCurrentDataSet ( true ) : 0 ;
2009-09-18 15:35:47 +00:00
}
2010-04-13 19:44:24 +01:00
2010-09-17 18:42:00 +02:00
// ============================================================================
2010-07-01 16:23:26 +02:00
2009-09-18 15:35:47 +00:00
} //excel
} //vba
} //ooo
2010-10-12 15:59:00 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */