2010-10-12 15:59:00 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2012-11-30 12:23:25 +00:00
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice :
*
* 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 .
*/
2007-04-25 15:14:08 +00:00
# include "vbaworksheets.hxx"
# include <sfx2/dispatch.hxx>
# include <sfx2/app.hxx>
# include <sfx2/bindings.hxx>
# include <sfx2/request.hxx>
# include <sfx2/viewfrm.hxx>
# include <sfx2/itemwrapper.hxx>
2009-10-16 00:05:16 +02:00
# include <svl/itemset.hxx>
# include <svl/eitem.hxx>
2007-04-25 15:14:08 +00:00
# include <comphelper/processfactory.hxx>
# include <cppuhelper/implbase3.hxx>
# include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
# include <com/sun/star/container/XEnumerationAccess.hpp>
# include <com/sun/star/sheet/XSpreadsheetView.hpp>
# include <com/sun/star/container/XNamed.hpp>
# include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
# include <com/sun/star/beans/XPropertySet.hpp>
2009-02-13 13:03:24 +00:00
# include <ooo/vba/excel/XApplication.hpp>
2007-04-25 15:14:08 +00:00
# include <tools/string.hxx>
2007-12-07 10:07:19 +00:00
# include "tabvwsh.hxx"
2007-04-25 15:14:08 +00:00
# include "vbaglobals.hxx"
# include "vbaworksheet.hxx"
# include "vbaworkbook.hxx"
2010-08-05 15:43:06 +02:00
# include "unonames.hxx"
2011-11-23 21:32:01 -05:00
# include "markdata.hxx"
2007-04-25 15:14:08 +00:00
2011-04-15 13:52:40 +01:00
# include <vector>
2012-04-24 11:23:46 +01:00
# include "prevwsh.hxx"
# include "preview.hxx"
2009-02-13 13:03:24 +00:00
using namespace : : ooo : : vba ;
2007-04-25 15:14:08 +00:00
using namespace : : com : : sun : : star ;
2007-12-07 10:07:19 +00:00
typedef : : cppu : : WeakImplHelper1 < container : : XEnumeration > SheetEnumeration_BASE ;
typedef : : cppu : : WeakImplHelper3 < container : : XNameAccess , container : : XIndexAccess , container : : XEnumerationAccess > SheetCollectionHelper_BASE ;
// a map ( or hashmap ) wont do as we need also to preserve the order
// (as added ) of the items
typedef std : : vector < uno : : Reference < sheet : : XSpreadsheet > > SheetMap ;
2010-07-01 16:23:26 +02:00
// #FIXME #TODO the implementation of the Sheets collections sucks,
// e.g. there is no support for tracking sheets added/removed from the collection
2007-12-07 10:07:19 +00:00
class WorkSheetsEnumeration : public SheetEnumeration_BASE
{
SheetMap mSheetMap ;
SheetMap : : iterator mIt ;
public :
WorkSheetsEnumeration ( const SheetMap & sMap ) : mSheetMap ( sMap ) , mIt ( mSheetMap . begin ( ) ) { }
virtual : : sal_Bool SAL_CALL hasMoreElements ( ) throw ( uno : : RuntimeException )
{
return ( mIt ! = mSheetMap . end ( ) ) ;
}
virtual uno : : Any SAL_CALL nextElement ( ) throw ( container : : NoSuchElementException , lang : : WrappedTargetException , uno : : RuntimeException )
{
if ( ! hasMoreElements ( ) )
throw container : : NoSuchElementException ( ) ;
uno : : Reference < sheet : : XSpreadsheet > xSheet ( * mIt + + ) ;
return uno : : makeAny ( xSheet ) ;
}
} ;
class SheetCollectionHelper : public SheetCollectionHelper_BASE
{
SheetMap mSheetMap ;
SheetMap : : iterator cachePos ;
public :
2007-12-14 10:02:02 +00:00
SheetCollectionHelper ( const SheetMap & sMap ) : mSheetMap ( sMap ) , cachePos ( mSheetMap . begin ( ) ) { }
2007-12-07 10:07:19 +00:00
// XElementAccess
virtual uno : : Type SAL_CALL getElementType ( ) throw ( uno : : RuntimeException ) { return sheet : : XSpreadsheet : : static_type ( 0 ) ; }
2011-05-29 11:39:15 +07:00
virtual : : sal_Bool SAL_CALL hasElements ( ) throw ( uno : : RuntimeException ) { return ( ! mSheetMap . empty ( ) ) ; }
2007-12-07 10:07:19 +00:00
// XNameAcess
virtual uno : : Any SAL_CALL getByName ( const : : rtl : : OUString & aName ) throw ( container : : NoSuchElementException , lang : : WrappedTargetException , uno : : RuntimeException )
{
if ( ! hasByName ( aName ) )
throw container : : NoSuchElementException ( ) ;
return uno : : makeAny ( * cachePos ) ;
}
virtual uno : : Sequence < : : rtl : : OUString > SAL_CALL getElementNames ( ) throw ( uno : : RuntimeException )
{
uno : : Sequence < rtl : : OUString > sNames ( mSheetMap . size ( ) ) ;
rtl : : OUString * pString = sNames . getArray ( ) ;
SheetMap : : iterator it = mSheetMap . begin ( ) ;
SheetMap : : iterator it_end = mSheetMap . end ( ) ;
for ( ; it ! = it_end ; + + it , + + pString )
{
uno : : Reference < container : : XNamed > xName ( * it , uno : : UNO_QUERY_THROW ) ;
* pString = xName - > getName ( ) ;
}
return sNames ;
}
virtual : : sal_Bool SAL_CALL hasByName ( const : : rtl : : OUString & aName ) throw ( uno : : RuntimeException )
{
cachePos = mSheetMap . begin ( ) ;
SheetMap : : iterator it_end = mSheetMap . end ( ) ;
for ( ; cachePos ! = it_end ; + + cachePos )
{
uno : : Reference < container : : XNamed > xName ( * cachePos , uno : : UNO_QUERY_THROW ) ;
if ( aName . equals ( xName - > getName ( ) ) )
break ;
}
return ( cachePos ! = it_end ) ;
}
// XElementAccess
virtual : : sal_Int32 SAL_CALL getCount ( ) throw ( uno : : RuntimeException ) { return mSheetMap . size ( ) ; }
virtual uno : : Any SAL_CALL getByIndex ( : : sal_Int32 Index ) throw ( lang : : IndexOutOfBoundsException , lang : : WrappedTargetException , uno : : RuntimeException )
{
if ( Index < 0 | | Index > = getCount ( ) )
throw lang : : IndexOutOfBoundsException ( ) ;
return uno : : makeAny ( mSheetMap [ Index ] ) ;
}
// XEnumerationAccess
virtual uno : : Reference < container : : XEnumeration > SAL_CALL createEnumeration ( ) throw ( uno : : RuntimeException )
{
return new WorkSheetsEnumeration ( mSheetMap ) ;
}
} ;
2007-04-25 15:14:08 +00:00
class SheetsEnumeration : public EnumerationHelperImpl
{
uno : : Reference < frame : : XModel > m_xModel ;
public :
2010-07-01 16:23:26 +02:00
SheetsEnumeration ( const uno : : Reference < XHelperInterface > & xParent , const uno : : Reference < uno : : XComponentContext > & xContext , const uno : : Reference < container : : XEnumeration > & xEnumeration , const uno : : Reference < frame : : XModel > & xModel ) throw ( uno : : RuntimeException ) : EnumerationHelperImpl ( xParent , xContext , xEnumeration ) , m_xModel ( xModel ) { }
2007-04-25 15:14:08 +00:00
virtual uno : : Any SAL_CALL nextElement ( ) throw ( container : : NoSuchElementException , lang : : WrappedTargetException , uno : : RuntimeException )
{
uno : : Reference < sheet : : XSpreadsheet > xSheet ( m_xEnumeration - > nextElement ( ) , uno : : UNO_QUERY_THROW ) ;
2011-03-25 10:40:25 +01:00
uno : : Reference < XHelperInterface > xIf = excel : : getUnoSheetModuleObj ( xSheet ) ;
2010-07-01 16:23:26 +02:00
uno : : Any aRet ;
if ( ! xIf . is ( ) )
2011-03-25 10:40:25 +01:00
{
2010-07-01 16:23:26 +02:00
// if the Sheet is in a document created by the api unfortunately ( at the
// moment, it actually wont have the special Document modules
uno : : Reference < excel : : XWorksheet > xNewSheet ( new ScVbaWorksheet ( m_xParent , m_xContext , xSheet , m_xModel ) ) ;
aRet < < = xNewSheet ;
2011-03-25 10:40:25 +01:00
}
else
2010-07-01 16:23:26 +02:00
aRet < < = xIf ;
return aRet ;
2007-04-25 15:14:08 +00:00
}
} ;
2009-02-13 13:03:24 +00:00
ScVbaWorksheets : : ScVbaWorksheets ( const uno : : Reference < XHelperInterface > & xParent , const uno : : Reference < : : com : : sun : : star : : uno : : XComponentContext > & xContext , const uno : : Reference < container : : XIndexAccess > & xSheets , const uno : : Reference < frame : : XModel > & xModel ) : ScVbaWorksheets_BASE ( xParent , xContext , xSheets ) , mxModel ( xModel ) , m_xSheets ( uno : : Reference < sheet : : XSpreadsheets > ( xSheets , uno : : UNO_QUERY ) )
2007-04-25 15:14:08 +00:00
{
}
2009-02-13 13:03:24 +00:00
ScVbaWorksheets : : ScVbaWorksheets ( const uno : : Reference < XHelperInterface > & xParent , const uno : : Reference < : : com : : sun : : star : : uno : : XComponentContext > & xContext , const uno : : Reference < container : : XEnumerationAccess > & xEnumAccess , const uno : : Reference < frame : : XModel > & xModel ) : ScVbaWorksheets_BASE ( xParent , xContext , uno : : Reference < container : : XIndexAccess > ( xEnumAccess , uno : : UNO_QUERY ) ) , mxModel ( xModel )
2007-04-25 15:14:08 +00:00
{
}
// XEnumerationAccess
uno : : Type
ScVbaWorksheets : : getElementType ( ) throw ( uno : : RuntimeException )
{
return excel : : XWorksheet : : static_type ( 0 ) ;
}
uno : : Reference < container : : XEnumeration >
ScVbaWorksheets : : createEnumeration ( ) throw ( uno : : RuntimeException )
{
if ( ! m_xSheets . is ( ) )
{
uno : : Reference < container : : XEnumerationAccess > xAccess ( m_xIndexAccess , uno : : UNO_QUERY_THROW ) ;
return xAccess - > createEnumeration ( ) ;
}
uno : : Reference < container : : XEnumerationAccess > xEnumAccess ( m_xSheets , uno : : UNO_QUERY_THROW ) ;
2007-12-07 10:07:19 +00:00
return new SheetsEnumeration ( this , mxContext , xEnumAccess - > createEnumeration ( ) , mxModel ) ;
2007-04-25 15:14:08 +00:00
}
uno : : Any
ScVbaWorksheets : : createCollectionObject ( const uno : : Any & aSource )
{
uno : : Reference < sheet : : XSpreadsheet > xSheet ( aSource , uno : : UNO_QUERY ) ;
2011-03-25 10:40:25 +01:00
uno : : Reference < XHelperInterface > xIf = excel : : getUnoSheetModuleObj ( xSheet ) ;
2010-07-01 16:23:26 +02:00
uno : : Any aRet ;
if ( ! xIf . is ( ) )
{
// if the Sheet is in a document created by the api unfortunately ( at the
// moment, it actually wont have the special Document modules
uno : : Reference < excel : : XWorksheet > xNewSheet ( new ScVbaWorksheet ( getParent ( ) , mxContext , xSheet , mxModel ) ) ;
aRet < < = xNewSheet ;
}
else
aRet < < = xIf ;
return aRet ;
2007-04-25 15:14:08 +00:00
}
// XWorksheets
uno : : Any
ScVbaWorksheets : : Add ( const uno : : Any & Before , const uno : : Any & After ,
const uno : : Any & Count , const uno : : Any & Type ) throw ( uno : : RuntimeException )
{
if ( isSelectedSheets ( ) )
return uno : : Any ( ) ; // or should we throw?
rtl : : OUString aStringSheet ;
sal_Bool bBefore ( sal_True ) ;
SCTAB nSheetIndex = 0 ;
SCTAB nNewSheets = 1 , nType = 0 ;
Count > > = nNewSheets ;
Type > > = nType ;
SCTAB nCount = 0 ;
2009-09-18 15:24:22 +00:00
uno : : Reference < excel : : XWorksheet > xBeforeAfterSheet ;
if ( Before . hasValue ( ) )
2007-04-25 15:14:08 +00:00
{
2009-09-18 15:24:22 +00:00
if ( Before > > = xBeforeAfterSheet )
aStringSheet = xBeforeAfterSheet - > getName ( ) ;
else
Before > > = aStringSheet ;
}
2012-01-06 14:22:10 -02:00
if ( aStringSheet . isEmpty ( ) & & After . hasValue ( ) )
2009-09-18 15:24:22 +00:00
{
if ( After > > = xBeforeAfterSheet )
aStringSheet = xBeforeAfterSheet - > getName ( ) ;
else
After > > = aStringSheet ;
2011-03-10 16:55:21 -05:00
bBefore = false ;
2007-04-25 15:14:08 +00:00
}
2012-01-06 14:22:10 -02:00
if ( aStringSheet . isEmpty ( ) )
2007-04-25 15:14:08 +00:00
{
2009-09-18 15:24:22 +00:00
uno : : Reference < excel : : XApplication > xApplication ( Application ( ) , uno : : UNO_QUERY_THROW ) ;
aStringSheet = xApplication - > getActiveWorkbook ( ) - > getActiveSheet ( ) - > getName ( ) ;
2007-04-25 15:14:08 +00:00
bBefore = sal_True ;
}
nCount = static_cast < SCTAB > ( m_xIndexAccess - > getCount ( ) ) ;
for ( SCTAB i = 0 ; i < nCount ; i + + )
{
uno : : Reference < sheet : : XSpreadsheet > xSheet ( m_xIndexAccess - > getByIndex ( i ) , uno : : UNO_QUERY ) ;
uno : : Reference < container : : XNamed > xNamed ( xSheet , uno : : UNO_QUERY_THROW ) ;
if ( xNamed - > getName ( ) = = aStringSheet )
{
nSheetIndex = i ;
break ;
}
}
if ( ! bBefore )
nSheetIndex + + ;
SCTAB nSheetName = nCount + 1L ;
String aStringBase ( RTL_CONSTASCII_USTRINGPARAM ( " Sheet " ) ) ;
uno : : Any result ;
for ( SCTAB i = 0 ; i < nNewSheets ; i + + , nSheetName + + )
{
2013-02-24 16:08:05 +01:00
OUString aStringName = aStringBase + OUString : : number ( nSheetName ) ;
2007-04-25 15:14:08 +00:00
while ( m_xNameAccess - > hasByName ( aStringName ) )
{
nSheetName + + ;
2013-02-24 16:08:05 +01:00
aStringName = aStringBase + OUString : : number ( nSheetName ) ;
2007-04-25 15:14:08 +00:00
}
m_xSheets - > insertNewByName ( aStringName , nSheetIndex + i ) ;
result = getItemByStringIndex ( aStringName ) ;
}
2009-09-18 15:24:22 +00:00
uno : : Reference < excel : : XWorksheet > xNewSheet ( result , uno : : UNO_QUERY ) ;
if ( xNewSheet . is ( ) )
xNewSheet - > Activate ( ) ;
2007-04-25 15:14:08 +00:00
return result ;
}
void
ScVbaWorksheets : : Delete ( ) throw ( uno : : RuntimeException )
{
2007-12-07 10:07:19 +00:00
// #TODO #INVESTIGATE
// mmm this method could be trouble if the underlying
// uno objects ( the m_xIndexAccess etc ) aren't aware of the
// contents that are deleted
sal_Int32 nElems = getCount ( ) ;
for ( sal_Int32 nItem = 1 ; nItem < = nElems ; + + nItem )
{
uno : : Reference < excel : : XWorksheet > xSheet ( Item ( uno : : makeAny ( nItem ) , uno : : Any ( ) ) , uno : : UNO_QUERY_THROW ) ;
xSheet - > Delete ( ) ;
}
2007-04-25 15:14:08 +00:00
}
bool
ScVbaWorksheets : : isSelectedSheets ( )
{
return ! m_xSheets . is ( ) ;
}
void SAL_CALL
ScVbaWorksheets : : PrintOut ( 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 ) throw ( uno : : RuntimeException )
{
sal_Int32 nTo = 0 ;
sal_Int32 nFrom = 0 ;
sal_Int16 nCopies = 1 ;
2011-03-10 16:55:21 -05:00
sal_Bool bCollate = false ;
sal_Bool bSelection = false ;
2007-04-25 15:14:08 +00:00
From > > = nFrom ;
To > > = nTo ;
Copies > > = nCopies ;
if ( nCopies > 1 ) // Collate only useful when more that 1 copy
Collate > > = bCollate ;
if ( ! ( nFrom | | nTo ) )
if ( isSelectedSheets ( ) )
bSelection = sal_True ;
2009-09-18 15:24:22 +00:00
PrintOutHelper ( excel : : getBestViewShell ( mxModel ) , From , To , Copies , Preview , ActivePrinter , PrintToFile , Collate , PrToFileName , bSelection ) ;
2007-04-25 15:14:08 +00:00
}
uno : : Any SAL_CALL
ScVbaWorksheets : : getVisible ( ) throw ( uno : : RuntimeException )
{
sal_Bool bVisible = sal_True ;
uno : : Reference < container : : XEnumeration > xEnum ( createEnumeration ( ) , uno : : UNO_QUERY_THROW ) ;
while ( xEnum - > hasMoreElements ( ) )
{
uno : : Reference < excel : : XWorksheet > xSheet ( xEnum - > nextElement ( ) , uno : : UNO_QUERY_THROW ) ;
2011-03-10 16:55:21 -05:00
if ( xSheet - > getVisible ( ) = = false )
2007-04-25 15:14:08 +00:00
{
2011-03-10 16:55:21 -05:00
bVisible = false ;
2007-04-25 15:14:08 +00:00
break ;
}
}
return uno : : makeAny ( bVisible ) ;
}
void SAL_CALL
ScVbaWorksheets : : setVisible ( const uno : : Any & _visible ) throw ( uno : : RuntimeException )
{
2011-03-10 16:55:21 -05:00
sal_Bool bState = false ;
2007-04-25 15:14:08 +00:00
if ( _visible > > = bState )
{
uno : : Reference < container : : XEnumeration > xEnum ( createEnumeration ( ) , uno : : UNO_QUERY_THROW ) ;
while ( xEnum - > hasMoreElements ( ) )
{
uno : : Reference < excel : : XWorksheet > xSheet ( xEnum - > nextElement ( ) , uno : : UNO_QUERY_THROW ) ;
xSheet - > setVisible ( bState ) ;
}
}
else
throw uno : : RuntimeException ( rtl : : OUString (
RTL_CONSTASCII_USTRINGPARAM ( " Visible property doesn't support non boolean #FIXME " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
}
2007-12-07 10:07:19 +00:00
void SAL_CALL
ScVbaWorksheets : : Select ( const uno : : Any & Replace ) throw ( uno : : RuntimeException )
{
2009-09-18 15:24:22 +00:00
ScTabViewShell * pViewShell = excel : : getBestViewShell ( mxModel ) ;
2007-12-07 10:07:19 +00:00
if ( ! pViewShell )
throw uno : : RuntimeException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Cannot obtain view shell " ) ) , uno : : Reference < uno : : XInterface > ( ) ) ;
ScMarkData & rMarkData = pViewShell - > GetViewData ( ) - > GetMarkData ( ) ;
sal_Bool bReplace = sal_True ;
Replace > > = bReplace ;
// Replace is defaulted to True, meanining this current collection
// becomes the Selection, if it were false then the current selection would
// be extended
bool bSelectSingle = bReplace ;
sal_Int32 nElems = getCount ( ) ;
for ( sal_Int32 nItem = 1 ; nItem < = nElems ; + + nItem )
{
uno : : Reference < excel : : XWorksheet > xSheet ( Item ( uno : : makeAny ( nItem ) , uno : : Any ( ) ) , uno : : UNO_QUERY_THROW ) ;
2011-04-07 17:14:41 +01:00
ScVbaWorksheet * pSheet = excel : : getImplFromDocModuleWrapper < ScVbaWorksheet > ( xSheet ) ;
if ( bSelectSingle )
2007-12-07 10:07:19 +00:00
{
2011-04-07 17:14:41 +01:00
rMarkData . SelectOneTable ( static_cast < SCTAB > ( pSheet - > getSheetID ( ) ) ) ;
bSelectSingle = false ;
2007-12-07 10:07:19 +00:00
}
2011-04-07 17:14:41 +01:00
else
rMarkData . SelectTable ( static_cast < SCTAB > ( pSheet - > getSheetID ( ) ) , sal_True ) ;
2007-12-07 10:07:19 +00:00
}
}
2011-04-15 13:52:40 +01:00
void SAL_CALL
ScVbaWorksheets : : Copy ( const uno : : Any & Before , const uno : : Any & After ) throw ( css : : uno : : RuntimeException )
{
uno : : Reference < excel : : XWorksheet > xSheet ;
sal_Int32 nElems = getCount ( ) ;
bool bAfter = After . hasValue ( ) ;
std : : vector < uno : : Reference < excel : : XWorksheet > > Sheets ;
sal_Int32 nItem = 0 ;
for ( nItem = 1 ; nItem < = nElems ; + + nItem )
{
uno : : Reference < excel : : XWorksheet > xWorksheet ( Item ( uno : : makeAny ( nItem ) , uno : : Any ( ) ) , uno : : UNO_QUERY_THROW ) ;
Sheets . push_back ( xWorksheet ) ;
}
bool bNewDoc = ( ! ( Before > > = xSheet ) & & ! ( After > > = xSheet ) & & ! ( Before . hasValue ( ) ) & & ! ( After . hasValue ( ) ) ) ;
uno : : Reference < excel : : XWorksheet > xSrcSheet ;
if ( bNewDoc )
{
bAfter = true ;
xSrcSheet = Sheets . at ( 0 ) ;
ScVbaWorksheet * pSrcSheet = excel : : getImplFromDocModuleWrapper < ScVbaWorksheet > ( xSrcSheet ) ;
xSheet = pSrcSheet - > createSheetCopyInNewDoc ( xSrcSheet - > getName ( ) ) ;
nItem = 1 ;
}
2011-04-26 09:32:22 +01:00
else
{
nItem = 0 ;
}
2011-04-15 13:52:40 +01:00
2011-04-26 09:32:22 +01:00
for ( ; nItem < nElems ; + + nItem )
2011-04-15 13:52:40 +01:00
{
xSrcSheet = Sheets [ nItem ] ;
ScVbaWorksheet * pSrcSheet = excel : : getImplFromDocModuleWrapper < ScVbaWorksheet > ( xSrcSheet ) ;
if ( bAfter )
xSheet = pSrcSheet - > createSheetCopy ( xSheet , bAfter ) ;
else
pSrcSheet - > createSheetCopy ( xSheet , bAfter ) ;
}
}
2007-04-25 15:14:08 +00:00
//ScVbaCollectionBaseImpl
2007-12-07 10:07:19 +00:00
uno : : Any SAL_CALL
ScVbaWorksheets : : Item ( const uno : : Any & Index , const uno : : Any & Index2 ) throw ( uno : : RuntimeException )
{
if ( Index . getValueTypeClass ( ) = = uno : : TypeClass_SEQUENCE )
{
uno : : Reference < script : : XTypeConverter > xConverter = getTypeConverter ( mxContext ) ;
uno : : Any aConverted ;
aConverted = xConverter - > convertTo ( Index , getCppuType ( ( uno : : Sequence < uno : : Any > * ) 0 ) ) ;
SheetMap mSheets ;
uno : : Sequence < uno : : Any > sIndices ;
aConverted > > = sIndices ;
sal_Int32 nElems = sIndices . getLength ( ) ;
for ( sal_Int32 index = 0 ; index < nElems ; + + index )
{
uno : : Reference < excel : : XWorksheet > xWorkSheet ( ScVbaWorksheets_BASE : : Item ( sIndices [ index ] , Index2 ) , uno : : UNO_QUERY_THROW ) ;
2011-04-07 17:14:41 +01:00
ScVbaWorksheet * pWorkSheet = excel : : getImplFromDocModuleWrapper < ScVbaWorksheet > ( xWorkSheet ) ;
uno : : Reference < sheet : : XSpreadsheet > xSheet ( pWorkSheet - > getSheet ( ) , uno : : UNO_QUERY_THROW ) ;
uno : : Reference < container : : XNamed > xName ( xSheet , uno : : UNO_QUERY_THROW ) ;
mSheets . push_back ( xSheet ) ;
2007-12-07 10:07:19 +00:00
}
uno : : Reference < container : : XIndexAccess > xIndexAccess = new SheetCollectionHelper ( mSheets ) ;
2009-02-13 13:03:24 +00:00
uno : : Reference < XCollection > xSelectedSheets ( new ScVbaWorksheets ( this - > getParent ( ) , mxContext , xIndexAccess , mxModel ) ) ;
2007-12-07 10:07:19 +00:00
return uno : : makeAny ( xSelectedSheets ) ;
}
return ScVbaWorksheets_BASE : : Item ( Index , Index2 ) ;
}
2007-04-25 15:14:08 +00:00
uno : : Any
ScVbaWorksheets : : getItemByStringIndex ( const rtl : : OUString & sIndex ) throw ( uno : : RuntimeException )
{
2008-07-08 06:24:55 +00:00
return ScVbaWorksheets_BASE : : getItemByStringIndex ( sIndex ) ;
2007-04-25 15:14:08 +00:00
}
2012-03-24 14:00:06 +00:00
rtl : : OUString
2007-12-07 10:07:19 +00:00
ScVbaWorksheets : : getServiceImplName ( )
{
2012-03-24 14:00:06 +00:00
return rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ScVbaWorksheets " ) ) ;
2007-12-07 10:07:19 +00:00
}
2007-04-25 15:14:08 +00:00
2007-12-07 10:07:19 +00:00
css : : uno : : Sequence < rtl : : OUString >
ScVbaWorksheets : : getServiceNames ( )
{
static uno : : Sequence < rtl : : OUString > sNames ;
if ( sNames . getLength ( ) = = 0 )
{
sNames . realloc ( 1 ) ;
2009-02-13 13:03:24 +00:00
sNames [ 0 ] = rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " ooo.vba.excel.Worksheets " ) ) ;
2007-12-07 10:07:19 +00:00
}
return sNames ;
}
2010-06-15 20:02:53 +02:00
2011-01-16 19:21:03 +01:00
bool ScVbaWorksheets : : nameExists ( uno : : Reference < sheet : : XSpreadsheetDocument > & xSpreadDoc , const : : rtl : : OUString & name , SCTAB & nTab ) throw ( lang : : IllegalArgumentException )
2010-06-15 20:02:53 +02:00
{
if ( ! xSpreadDoc . is ( ) )
throw lang : : IllegalArgumentException ( rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " nameExists() xSpreadDoc is null " ) ) , uno : : Reference < uno : : XInterface > ( ) , 1 ) ;
uno : : Reference < container : : XIndexAccess > xIndex ( xSpreadDoc - > getSheets ( ) , uno : : UNO_QUERY ) ;
if ( xIndex . is ( ) )
{
SCTAB nCount = static_cast < SCTAB > ( xIndex - > getCount ( ) ) ;
for ( SCTAB i = 0 ; i < nCount ; i + + )
{
uno : : Reference < container : : XNamed > xNamed ( xIndex - > getByIndex ( i ) , uno : : UNO_QUERY_THROW ) ;
if ( xNamed - > getName ( ) = = name )
{
nTab = i ;
return true ;
}
}
}
return false ;
}
2010-10-12 15:59:00 +02:00
2012-04-24 11:23:46 +01:00
void ScVbaWorksheets : : PrintPreview ( const css : : uno : : Any & /*EnableChanges*/ ) throw ( css : : uno : : RuntimeException )
2012-04-23 13:33:15 +01:00
{
// need test, print preview current active sheet
// !! TODO !! get view shell from controller
2012-04-24 11:23:46 +01:00
ScTabViewShell * pViewShell = excel : : getBestViewShell ( mxModel ) ;
SfxViewFrame * pViewFrame = NULL ;
if ( pViewShell )
pViewFrame = pViewShell - > GetViewFrame ( ) ;
if ( pViewFrame )
{
if ( ! pViewFrame - > GetFrame ( ) . IsInPlace ( ) )
{
dispatchExecute ( pViewShell , SID_VIEWSHELL1 ) ;
SfxViewShell * pShell = SfxViewShell : : Get ( pViewFrame - > GetFrame ( ) . GetFrameInterface ( ) - > getController ( ) ) ;
if ( pShell - > ISA ( ScPreviewShell ) )
{
ScPreviewShell * pPrvShell = static_cast < ScPreviewShell * > ( pShell ) ;
ScPreview * pPrvView = pPrvShell - > GetPreview ( ) ;
ScMarkData aMarkData ;
sal_Int32 nElems = getCount ( ) ;
for ( sal_Int32 nItem = 1 ; nItem < = nElems ; + + nItem )
{
uno : : Reference < excel : : XWorksheet > xSheet ( Item ( uno : : makeAny ( nItem ) , uno : : Any ( ) ) , uno : : UNO_QUERY_THROW ) ;
ScVbaWorksheet * pSheet = excel : : getImplFromDocModuleWrapper < ScVbaWorksheet > ( xSheet ) ;
if ( pSheet )
aMarkData . SelectTable ( static_cast < SCTAB > ( pSheet - > getSheetID ( ) ) , true ) ;
}
// save old selection, setting the selectedtabs in the preview
// can affect the current selection when preview has been
// closed
ScMarkData : : MarkedTabsType aOldTabs = pPrvView - > GetSelectedTabs ( ) ;
pPrvView - > SetSelectedTabs ( aMarkData ) ;
// force update
pPrvView - > DataChanged ( ) ;
// set sensible first page
long nPage = pPrvView - > GetFirstPage ( 1 ) ;
pPrvView - > SetPageNo ( nPage ) ;
WaitUntilPreviewIsClosed ( pViewFrame ) ;
// restore old tab selection
pViewShell = excel : : getBestViewShell ( mxModel ) ;
pViewShell - > GetViewData ( ) - > GetMarkData ( ) . SetSelectedTabs ( aOldTabs ) ;
}
}
}
2012-04-23 13:33:15 +01:00
}
2010-10-12 15:59:00 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */