xref: /aoo41x/main/sw/source/ui/vba/vbatables.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir #include "vbatables.hxx"
2*cdf0e10cSrcweir #include "vbatable.hxx"
3*cdf0e10cSrcweir #include "vbarange.hxx"
4*cdf0e10cSrcweir #include <com/sun/star/text/XTextTable.hpp>
5*cdf0e10cSrcweir #include <com/sun/star/text/XTextTablesSupplier.hpp>
6*cdf0e10cSrcweir #include <com/sun/star/text/XTextDocument.hpp>
7*cdf0e10cSrcweir #include <comphelper/componentcontext.hxx>
8*cdf0e10cSrcweir 
9*cdf0e10cSrcweir using namespace ::ooo::vba;
10*cdf0e10cSrcweir using namespace css;
11*cdf0e10cSrcweir 
12*cdf0e10cSrcweir uno::Reference< container::XIndexAccess > lcl_getTables( const uno::Reference< frame::XModel >& xDoc )
13*cdf0e10cSrcweir {
14*cdf0e10cSrcweir     uno::Reference< container::XIndexAccess > xTables;
15*cdf0e10cSrcweir     uno::Reference< text::XTextTablesSupplier > xSupp( xDoc, uno::UNO_QUERY );
16*cdf0e10cSrcweir     if ( xSupp.is() )
17*cdf0e10cSrcweir         xTables.set( xSupp->getTextTables(), uno::UNO_QUERY_THROW );
18*cdf0e10cSrcweir     return xTables;
19*cdf0e10cSrcweir }
20*cdf0e10cSrcweir 
21*cdf0e10cSrcweir uno::Any lcl_createTable( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< frame::XModel >& xDocument, const uno::Any& aSource )
22*cdf0e10cSrcweir {
23*cdf0e10cSrcweir     uno::Reference< text::XTextTable > xTextTable( aSource, uno::UNO_QUERY_THROW );
24*cdf0e10cSrcweir     uno::Reference< text::XTextDocument > xTextDocument( xDocument, uno::UNO_QUERY_THROW );
25*cdf0e10cSrcweir     uno::Reference< word::XTable > xTable( new SwVbaTable( xParent, xContext, xTextDocument, xTextTable ) );
26*cdf0e10cSrcweir     return uno::makeAny( xTable );
27*cdf0e10cSrcweir }
28*cdf0e10cSrcweir 
29*cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1< css::container::XEnumeration > EnumBase;
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir class TableEnumerationImpl : public EnumBase
32*cdf0e10cSrcweir {
33*cdf0e10cSrcweir     uno::Reference< XHelperInterface > mxParent;
34*cdf0e10cSrcweir     uno::Reference< uno::XComponentContext > mxContext;
35*cdf0e10cSrcweir     uno::Reference< frame::XModel > mxDocument;
36*cdf0e10cSrcweir     uno::Reference< container::XIndexAccess > mxIndexAccess;
37*cdf0e10cSrcweir     sal_Int32 mnCurIndex;
38*cdf0e10cSrcweir public:
39*cdf0e10cSrcweir     TableEnumerationImpl(  const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext > & xContext, const uno::Reference< frame::XModel >& xDocument, const uno::Reference< container::XIndexAccess >& xIndexAccess ) : mxParent( xParent ), mxContext( xContext ), mxDocument( xDocument ), mxIndexAccess( xIndexAccess ), mnCurIndex(0)
40*cdf0e10cSrcweir     {
41*cdf0e10cSrcweir     }
42*cdf0e10cSrcweir     virtual ::sal_Bool SAL_CALL hasMoreElements(  ) throw (uno::RuntimeException)
43*cdf0e10cSrcweir     {
44*cdf0e10cSrcweir         return ( mnCurIndex < mxIndexAccess->getCount() );
45*cdf0e10cSrcweir     }
46*cdf0e10cSrcweir     virtual uno::Any SAL_CALL nextElement(  ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
47*cdf0e10cSrcweir     {
48*cdf0e10cSrcweir         if ( !hasMoreElements() )
49*cdf0e10cSrcweir             throw container::NoSuchElementException();
50*cdf0e10cSrcweir         return lcl_createTable( mxParent, mxContext, mxDocument, mxIndexAccess->getByIndex( mnCurIndex++ ) );
51*cdf0e10cSrcweir     }
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir };
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir SwVbaTables::SwVbaTables( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext > & xContext, const uno::Reference< frame::XModel >& xDocument ) : SwVbaTables_BASE( xParent, xContext , lcl_getTables( xDocument ) ), mxDocument( xDocument )
56*cdf0e10cSrcweir {
57*cdf0e10cSrcweir }
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir uno::Reference< word::XTable > SAL_CALL
61*cdf0e10cSrcweir SwVbaTables::Add( const uno::Reference< word::XRange >& Range, const uno::Any& NumRows, const uno::Any& NumColumns, const uno::Any& /*DefaultTableBehavior*/, const uno::Any& /*AutoFitBehavior*/ ) throw (script::BasicErrorException, uno::RuntimeException)
62*cdf0e10cSrcweir {
63*cdf0e10cSrcweir     sal_Int32 nCols = 0;
64*cdf0e10cSrcweir     sal_Int32 nRows = 0;
65*cdf0e10cSrcweir     SwVbaRange* pVbaRange = dynamic_cast< SwVbaRange* >( Range.get() );
66*cdf0e10cSrcweir     // Preconditions
67*cdf0e10cSrcweir     if ( !( pVbaRange && ( NumRows >>= nRows ) && ( NumColumns >>= nCols ) ) )
68*cdf0e10cSrcweir         throw uno::RuntimeException(); // #FIXME better exception??
69*cdf0e10cSrcweir     if ( nCols <= 0 || nRows <= 0 )
70*cdf0e10cSrcweir         throw uno::RuntimeException(); // #FIXME better exception??
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir     uno::Reference< frame::XModel > xModel( pVbaRange->getDocument(), uno::UNO_QUERY_THROW );
73*cdf0e10cSrcweir     uno::Reference< lang::XMultiServiceFactory > xMsf( xModel, uno::UNO_QUERY_THROW );
74*cdf0e10cSrcweir     uno::Reference< text::XTextRange > xTextRange = pVbaRange->getXTextRange();
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir     uno::Reference< text::XTextTable > xTable;
77*cdf0e10cSrcweir     xTable.set( xMsf->createInstance( rtl::OUString::createFromAscii("com.sun.star.text.TextTable") ), uno::UNO_QUERY_THROW );
78*cdf0e10cSrcweir /*
79*cdf0e10cSrcweir     comphelper::ComponentContext aCtx( xMsf );
80*cdf0e10cSrcweir     if ( !aCtx.createComponent( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextTable") ), xTable ) );
81*cdf0e10cSrcweir         throw uno::RuntimeException(); // #FIXME better exception??
82*cdf0e10cSrcweir */
83*cdf0e10cSrcweir     xTable->initialize( nRows, nCols );
84*cdf0e10cSrcweir     uno::Reference< text::XText > xText = xTextRange->getText();
85*cdf0e10cSrcweir     uno::Reference< text::XTextContent > xContext( xTable, uno::UNO_QUERY_THROW );
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir     xText->insertTextContent( xTextRange, xContext, true );
88*cdf0e10cSrcweir     uno::Reference< word::XTable > xVBATable( new SwVbaTable( mxParent, mxContext,  pVbaRange->getDocument(), xTable ) );
89*cdf0e10cSrcweir     return xVBATable;
90*cdf0e10cSrcweir }
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir uno::Reference< container::XEnumeration > SAL_CALL
93*cdf0e10cSrcweir SwVbaTables::createEnumeration() throw (uno::RuntimeException)
94*cdf0e10cSrcweir {
95*cdf0e10cSrcweir     return new TableEnumerationImpl( mxParent, mxContext, mxDocument, m_xIndexAccess );
96*cdf0e10cSrcweir }
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir // ScVbaCollectionBaseImpl
99*cdf0e10cSrcweir uno::Any
100*cdf0e10cSrcweir SwVbaTables::createCollectionObject( const uno::Any& aSource )
101*cdf0e10cSrcweir {
102*cdf0e10cSrcweir     return lcl_createTable( mxParent, mxContext, mxDocument, aSource );
103*cdf0e10cSrcweir }
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir // XHelperInterface
106*cdf0e10cSrcweir rtl::OUString&
107*cdf0e10cSrcweir SwVbaTables::getServiceImplName()
108*cdf0e10cSrcweir {
109*cdf0e10cSrcweir     static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("SwVbaTables") );
110*cdf0e10cSrcweir     return sImplName;
111*cdf0e10cSrcweir }
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir // XEnumerationAccess
114*cdf0e10cSrcweir uno::Type SAL_CALL
115*cdf0e10cSrcweir SwVbaTables::getElementType() throw (uno::RuntimeException)
116*cdf0e10cSrcweir {
117*cdf0e10cSrcweir     return  word::XTable::static_type(0);
118*cdf0e10cSrcweir }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir uno::Sequence<rtl::OUString>
121*cdf0e10cSrcweir SwVbaTables::getServiceNames()
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir     static uno::Sequence< rtl::OUString > aServiceNames;
124*cdf0e10cSrcweir     if ( aServiceNames.getLength() == 0 )
125*cdf0e10cSrcweir     {
126*cdf0e10cSrcweir         aServiceNames.realloc( 1 );
127*cdf0e10cSrcweir         aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.word.Tables" ) );
128*cdf0e10cSrcweir     }
129*cdf0e10cSrcweir     return aServiceNames;
130*cdf0e10cSrcweir }
131*cdf0e10cSrcweir 
132