1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b3f79822SAndrew Rist * distributed with this work for additional information
6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10*b3f79822SAndrew Rist *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist *
13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17*b3f79822SAndrew Rist * specific language governing permissions and limitations
18*b3f79822SAndrew Rist * under the License.
19*b3f79822SAndrew Rist *
20*b3f79822SAndrew Rist *************************************************************/
21*b3f79822SAndrew Rist
22*b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "vbasheetobjects.hxx"
25cdf0e10cSrcweir #include <vector>
26cdf0e10cSrcweir #include <rtl/math.hxx>
27cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
28cdf0e10cSrcweir #include <com/sun/star/container/XIndexContainer.hpp>
29cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp>
30cdf0e10cSrcweir #include <com/sun/star/drawing/XControlShape.hpp>
31cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
32cdf0e10cSrcweir #include <com/sun/star/drawing/XShapes.hpp>
33cdf0e10cSrcweir #include <com/sun/star/form/FormComponentType.hpp>
34cdf0e10cSrcweir #include <com/sun/star/form/XForm.hpp>
35cdf0e10cSrcweir #include <com/sun/star/form/XFormComponent.hpp>
36cdf0e10cSrcweir #include <com/sun/star/form/XFormsSupplier.hpp>
37cdf0e10cSrcweir #include <oox/helper/helper.hxx>
38cdf0e10cSrcweir #include "vbasheetobject.hxx"
39cdf0e10cSrcweir
40cdf0e10cSrcweir using ::rtl::OUString;
41cdf0e10cSrcweir using namespace ::com::sun::star;
42cdf0e10cSrcweir using namespace ::ooo::vba;
43cdf0e10cSrcweir
44cdf0e10cSrcweir // ============================================================================
45cdf0e10cSrcweir
46cdf0e10cSrcweir namespace {
47cdf0e10cSrcweir
48cdf0e10cSrcweir template< typename Type >
lclGetProperty(Type & orValue,const uno::Reference<beans::XPropertySet> & rxPropSet,const OUString & rPropName)49cdf0e10cSrcweir inline bool lclGetProperty( Type& orValue, const uno::Reference< beans::XPropertySet >& rxPropSet, const OUString& rPropName )
50cdf0e10cSrcweir {
51cdf0e10cSrcweir try
52cdf0e10cSrcweir {
53cdf0e10cSrcweir return rxPropSet->getPropertyValue( rPropName ) >>= orValue;
54cdf0e10cSrcweir }
55cdf0e10cSrcweir catch( uno::Exception& )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir }
58cdf0e10cSrcweir return false;
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
61cdf0e10cSrcweir /** Rounds the passed value to a multiple of 0.75 and converts it to 1/100 mm. */
lclPointsToHmm(const uno::Any & rPoints)62cdf0e10cSrcweir inline double lclPointsToHmm( const uno::Any& rPoints ) throw (uno::RuntimeException)
63cdf0e10cSrcweir {
64cdf0e10cSrcweir return PointsToHmm( ::rtl::math::approxFloor( rPoints.get< double >() / 0.75 ) * 0.75 );
65cdf0e10cSrcweir }
66cdf0e10cSrcweir
67cdf0e10cSrcweir } // namespace
68cdf0e10cSrcweir
69cdf0e10cSrcweir // ============================================================================
70cdf0e10cSrcweir // Base implementations
71cdf0e10cSrcweir // ============================================================================
72cdf0e10cSrcweir
73cdf0e10cSrcweir /** Container for a specific type of drawing object in a spreadsheet.
74cdf0e10cSrcweir
75cdf0e10cSrcweir Derived classes provide all required functionality specific to the type of
76cdf0e10cSrcweir shapes covered by the container.
77cdf0e10cSrcweir */
78cdf0e10cSrcweir class ScVbaObjectContainer : public ::cppu::WeakImplHelper1< container::XIndexAccess >
79cdf0e10cSrcweir {
80cdf0e10cSrcweir public:
81cdf0e10cSrcweir explicit ScVbaObjectContainer(
82cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
83cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
84cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
85cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet,
86cdf0e10cSrcweir const uno::Type& rVbaType ) throw (uno::RuntimeException);
87cdf0e10cSrcweir
88cdf0e10cSrcweir /** Returns the VBA helper interface of the VBA collection object. */
getParent() const89cdf0e10cSrcweir inline const uno::Reference< XHelperInterface >& getParent() const { return mxParent; }
90cdf0e10cSrcweir /** Returns the component context of the VBA collection object. */
getContext() const91cdf0e10cSrcweir inline const uno::Reference< uno::XComponentContext >& getContext() const { return mxContext; }
92cdf0e10cSrcweir /** Returns the VBA type information of the objects in this container. */
getVbaType() const93cdf0e10cSrcweir inline const uno::Type& getVbaType() const { return maVbaType; }
94cdf0e10cSrcweir
95cdf0e10cSrcweir /** Collects all shapes supported by this instance and inserts them into
96cdf0e10cSrcweir the internal shape vector. */
97cdf0e10cSrcweir void collectShapes() throw (uno::RuntimeException);
98cdf0e10cSrcweir /** Creates and returns a new UNO shape. */
99cdf0e10cSrcweir uno::Reference< drawing::XShape > createShape( const awt::Point& rPos, const awt::Size& rSize ) throw (uno::RuntimeException);
100cdf0e10cSrcweir /** Inserts the passed shape into the draw page and into this container, and returns its index in the draw page. */
101cdf0e10cSrcweir sal_Int32 insertShape( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException);
102cdf0e10cSrcweir /** Creates and returns a new VBA implementation object for the passed shape. */
103cdf0e10cSrcweir ::rtl::Reference< ScVbaSheetObjectBase > createVbaObject( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException);
104cdf0e10cSrcweir /** Creates and returns a new VBA implementation object for the passed shape in an Any. */
105cdf0e10cSrcweir uno::Any createCollectionObject( const uno::Any& rSource ) throw (uno::RuntimeException);
106cdf0e10cSrcweir /** Returns the VBA implementation object with the specified name. */
107cdf0e10cSrcweir uno::Any getItemByStringIndex( const OUString& rIndex ) throw (uno::RuntimeException);
108cdf0e10cSrcweir
109cdf0e10cSrcweir // XIndexAccess
110cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getCount() throw (uno::RuntimeException);
111cdf0e10cSrcweir virtual uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException);
112cdf0e10cSrcweir
113cdf0e10cSrcweir // XElementAccess
114cdf0e10cSrcweir virtual uno::Type SAL_CALL getElementType() throw (uno::RuntimeException);
115cdf0e10cSrcweir virtual sal_Bool SAL_CALL hasElements() throw (uno::RuntimeException);
116cdf0e10cSrcweir
117cdf0e10cSrcweir protected:
118cdf0e10cSrcweir /** Derived classes return true, if the passed shape is supported by the instance. */
119cdf0e10cSrcweir virtual bool implPickShape( const uno::Reference< drawing::XShape >& rxShape ) const = 0;
120cdf0e10cSrcweir /** Derived classes create and return a new VBA implementation object for the passed shape. */
121cdf0e10cSrcweir virtual ScVbaSheetObjectBase* implCreateVbaObject( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException) = 0;
122cdf0e10cSrcweir /** Derived classes return the service name of the UNO shape. */
123cdf0e10cSrcweir virtual OUString implGetShapeServiceName() const = 0;
124cdf0e10cSrcweir
125cdf0e10cSrcweir /** Returns the shape name via 'Name' property of the UNO shape. May be overwritten. */
126cdf0e10cSrcweir virtual OUString implGetShapeName( const uno::Reference< drawing::XShape >& rxShape ) const throw (uno::RuntimeException);
127cdf0e10cSrcweir /** Is called when a new UNO shape has been created but not yet inserted into the drawing page. */
128cdf0e10cSrcweir virtual void implOnShapeCreated( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException);
129cdf0e10cSrcweir /** Is called when a new UNO shape has been inserted into the drawing page. */
130cdf0e10cSrcweir virtual void implOnShapeInserted( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException);
131cdf0e10cSrcweir
132cdf0e10cSrcweir protected:
133cdf0e10cSrcweir uno::Reference< XHelperInterface > mxParent;
134cdf0e10cSrcweir uno::Reference< uno::XComponentContext > mxContext;
135cdf0e10cSrcweir uno::Reference< frame::XModel > mxModel;
136cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > mxFactory;
137cdf0e10cSrcweir uno::Reference< drawing::XShapes > mxShapes;
138cdf0e10cSrcweir
139cdf0e10cSrcweir private:
140cdf0e10cSrcweir typedef ::std::vector< uno::Reference< drawing::XShape > > ShapeVector;
141cdf0e10cSrcweir const uno::Type maVbaType;
142cdf0e10cSrcweir ShapeVector maShapes;
143cdf0e10cSrcweir };
144cdf0e10cSrcweir
145cdf0e10cSrcweir // ----------------------------------------------------------------------------
146cdf0e10cSrcweir
ScVbaObjectContainer(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<sheet::XSpreadsheet> & rxSheet,const uno::Type & rVbaType)147cdf0e10cSrcweir ScVbaObjectContainer::ScVbaObjectContainer(
148cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
149cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
150cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
151cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet,
152cdf0e10cSrcweir const uno::Type& rVbaType ) throw (uno::RuntimeException) :
153cdf0e10cSrcweir mxParent( rxParent ),
154cdf0e10cSrcweir mxContext( rxContext ),
155cdf0e10cSrcweir mxModel( rxModel, uno::UNO_SET_THROW ),
156cdf0e10cSrcweir mxFactory( rxModel, uno::UNO_QUERY_THROW ),
157cdf0e10cSrcweir maVbaType( rVbaType )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupp( rxSheet, uno::UNO_QUERY_THROW );
160cdf0e10cSrcweir mxShapes.set( xDrawPageSupp->getDrawPage(), uno::UNO_QUERY_THROW );
161cdf0e10cSrcweir }
162cdf0e10cSrcweir
collectShapes()163cdf0e10cSrcweir void ScVbaObjectContainer::collectShapes() throw (uno::RuntimeException)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir maShapes.clear();
166cdf0e10cSrcweir for( sal_Int32 nIndex = 0, nCount = mxShapes->getCount(); nIndex < nCount; ++nIndex )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape( mxShapes->getByIndex( nIndex ), uno::UNO_QUERY_THROW );
169cdf0e10cSrcweir if( implPickShape( xShape ) )
170cdf0e10cSrcweir maShapes.push_back( xShape );
171cdf0e10cSrcweir }
172cdf0e10cSrcweir }
173cdf0e10cSrcweir
createShape(const awt::Point & rPos,const awt::Size & rSize)174cdf0e10cSrcweir uno::Reference< drawing::XShape > ScVbaObjectContainer::createShape( const awt::Point& rPos, const awt::Size& rSize ) throw (uno::RuntimeException)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape( mxFactory->createInstance( implGetShapeServiceName() ), uno::UNO_QUERY_THROW );
177cdf0e10cSrcweir xShape->setPosition( rPos );
178cdf0e10cSrcweir xShape->setSize( rSize );
179cdf0e10cSrcweir implOnShapeCreated( xShape );
180cdf0e10cSrcweir return xShape;
181cdf0e10cSrcweir }
182cdf0e10cSrcweir
insertShape(const uno::Reference<drawing::XShape> & rxShape)183cdf0e10cSrcweir sal_Int32 ScVbaObjectContainer::insertShape( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException)
184cdf0e10cSrcweir {
185cdf0e10cSrcweir mxShapes->add( rxShape );
186cdf0e10cSrcweir maShapes.push_back( rxShape );
187cdf0e10cSrcweir implOnShapeInserted( rxShape );
188cdf0e10cSrcweir return mxShapes->getCount() - 1;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir
createVbaObject(const uno::Reference<drawing::XShape> & rxShape)191cdf0e10cSrcweir ::rtl::Reference< ScVbaSheetObjectBase > ScVbaObjectContainer::createVbaObject(
192cdf0e10cSrcweir const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException)
193cdf0e10cSrcweir {
194cdf0e10cSrcweir return implCreateVbaObject( rxShape );
195cdf0e10cSrcweir }
196cdf0e10cSrcweir
createCollectionObject(const uno::Any & rSource)197cdf0e10cSrcweir uno::Any ScVbaObjectContainer::createCollectionObject( const uno::Any& rSource ) throw (uno::RuntimeException)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape( rSource, uno::UNO_QUERY_THROW );
200cdf0e10cSrcweir uno::Reference< excel::XSheetObject > xSheetObject( implCreateVbaObject( xShape ) );
201cdf0e10cSrcweir return uno::Any( xSheetObject );
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
getItemByStringIndex(const OUString & rIndex)204cdf0e10cSrcweir uno::Any ScVbaObjectContainer::getItemByStringIndex( const OUString& rIndex ) throw (uno::RuntimeException)
205cdf0e10cSrcweir {
206cdf0e10cSrcweir for( ShapeVector::iterator aIt = maShapes.begin(), aEnd = maShapes.end(); aIt != aEnd; ++aIt )
207cdf0e10cSrcweir if( rIndex == implGetShapeName( *aIt ) )
208cdf0e10cSrcweir return createCollectionObject( uno::Any( *aIt ) );
209cdf0e10cSrcweir throw uno::RuntimeException();
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
212cdf0e10cSrcweir // XIndexAccess
213cdf0e10cSrcweir
getCount()214cdf0e10cSrcweir sal_Int32 SAL_CALL ScVbaObjectContainer::getCount() throw (uno::RuntimeException)
215cdf0e10cSrcweir {
216cdf0e10cSrcweir return static_cast< sal_Int32 >( maShapes.size() );
217cdf0e10cSrcweir }
218cdf0e10cSrcweir
getByIndex(sal_Int32 nIndex)219cdf0e10cSrcweir uno::Any SAL_CALL ScVbaObjectContainer::getByIndex( sal_Int32 nIndex )
220cdf0e10cSrcweir throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
221cdf0e10cSrcweir {
222cdf0e10cSrcweir if( (0 <= nIndex) && (nIndex < getCount()) )
223cdf0e10cSrcweir return uno::Any( maShapes[ static_cast< size_t >( nIndex ) ] );
224cdf0e10cSrcweir throw lang::IndexOutOfBoundsException();
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir // XElementAccess
228cdf0e10cSrcweir
getElementType()229cdf0e10cSrcweir uno::Type SAL_CALL ScVbaObjectContainer::getElementType() throw (uno::RuntimeException)
230cdf0e10cSrcweir {
231cdf0e10cSrcweir return drawing::XShape::static_type( 0 );
232cdf0e10cSrcweir }
233cdf0e10cSrcweir
hasElements()234cdf0e10cSrcweir sal_Bool SAL_CALL ScVbaObjectContainer::hasElements() throw (uno::RuntimeException)
235cdf0e10cSrcweir {
236cdf0e10cSrcweir return !maShapes.empty();
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
239cdf0e10cSrcweir // private
240cdf0e10cSrcweir
implGetShapeName(const uno::Reference<drawing::XShape> & rxShape) const241cdf0e10cSrcweir OUString ScVbaObjectContainer::implGetShapeName( const uno::Reference< drawing::XShape >& rxShape ) const throw (uno::RuntimeException)
242cdf0e10cSrcweir {
243cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet( rxShape, uno::UNO_QUERY_THROW );
244cdf0e10cSrcweir return xPropSet->getPropertyValue( CREATE_OUSTRING( "Name" ) ).get< OUString >();
245cdf0e10cSrcweir }
246cdf0e10cSrcweir
implOnShapeCreated(const uno::Reference<drawing::XShape> &)247cdf0e10cSrcweir void ScVbaObjectContainer::implOnShapeCreated( const uno::Reference< drawing::XShape >& /*rxShape*/ ) throw (uno::RuntimeException)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir }
250cdf0e10cSrcweir
implOnShapeInserted(const uno::Reference<drawing::XShape> &)251cdf0e10cSrcweir void ScVbaObjectContainer::implOnShapeInserted( const uno::Reference< drawing::XShape >& /*rxShape*/ ) throw (uno::RuntimeException)
252cdf0e10cSrcweir {
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255cdf0e10cSrcweir // ============================================================================
256cdf0e10cSrcweir
257cdf0e10cSrcweir class ScVbaObjectEnumeration : public SimpleEnumerationBase
258cdf0e10cSrcweir {
259cdf0e10cSrcweir public:
260cdf0e10cSrcweir explicit ScVbaObjectEnumeration( const ScVbaObjectContainerRef& rxContainer );
261cdf0e10cSrcweir virtual uno::Any createCollectionObject( const uno::Any& rSource );
262cdf0e10cSrcweir
263cdf0e10cSrcweir private:
264cdf0e10cSrcweir ScVbaObjectContainerRef mxContainer;
265cdf0e10cSrcweir };
266cdf0e10cSrcweir
267cdf0e10cSrcweir // ----------------------------------------------------------------------------
268cdf0e10cSrcweir
ScVbaObjectEnumeration(const ScVbaObjectContainerRef & rxContainer)269cdf0e10cSrcweir ScVbaObjectEnumeration::ScVbaObjectEnumeration( const ScVbaObjectContainerRef& rxContainer ) :
270cdf0e10cSrcweir SimpleEnumerationBase( rxContainer->getParent(), rxContainer->getContext(), rxContainer.get() ),
271cdf0e10cSrcweir mxContainer( rxContainer )
272cdf0e10cSrcweir {
273cdf0e10cSrcweir }
274cdf0e10cSrcweir
createCollectionObject(const uno::Any & rSource)275cdf0e10cSrcweir uno::Any ScVbaObjectEnumeration::createCollectionObject( const uno::Any& rSource )
276cdf0e10cSrcweir {
277cdf0e10cSrcweir return mxContainer->createCollectionObject( rSource );
278cdf0e10cSrcweir }
279cdf0e10cSrcweir
280cdf0e10cSrcweir // ============================================================================
281cdf0e10cSrcweir
ScVbaSheetObjectsBase(const ScVbaObjectContainerRef & rxContainer)282cdf0e10cSrcweir ScVbaSheetObjectsBase::ScVbaSheetObjectsBase( const ScVbaObjectContainerRef& rxContainer ) throw (css::uno::RuntimeException) :
283cdf0e10cSrcweir ScVbaSheetObjects_BASE( rxContainer->getParent(), rxContainer->getContext(), rxContainer.get() ),
284cdf0e10cSrcweir mxContainer( rxContainer )
285cdf0e10cSrcweir {
286cdf0e10cSrcweir mxContainer->collectShapes();
287cdf0e10cSrcweir }
288cdf0e10cSrcweir
~ScVbaSheetObjectsBase()289cdf0e10cSrcweir ScVbaSheetObjectsBase::~ScVbaSheetObjectsBase()
290cdf0e10cSrcweir {
291cdf0e10cSrcweir }
292cdf0e10cSrcweir
collectShapes()293cdf0e10cSrcweir void ScVbaSheetObjectsBase::collectShapes() throw (uno::RuntimeException)
294cdf0e10cSrcweir {
295cdf0e10cSrcweir mxContainer->collectShapes();
296cdf0e10cSrcweir }
297cdf0e10cSrcweir
298cdf0e10cSrcweir // XEnumerationAccess
299cdf0e10cSrcweir
createEnumeration()300cdf0e10cSrcweir uno::Reference< container::XEnumeration > SAL_CALL ScVbaSheetObjectsBase::createEnumeration() throw (uno::RuntimeException)
301cdf0e10cSrcweir {
302cdf0e10cSrcweir return new ScVbaObjectEnumeration( mxContainer );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir
305cdf0e10cSrcweir // XElementAccess
306cdf0e10cSrcweir
getElementType()307cdf0e10cSrcweir uno::Type SAL_CALL ScVbaSheetObjectsBase::getElementType() throw (uno::RuntimeException)
308cdf0e10cSrcweir {
309cdf0e10cSrcweir return mxContainer->getVbaType();
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
312cdf0e10cSrcweir // ScVbaCollectionBase
313cdf0e10cSrcweir
createCollectionObject(const uno::Any & rSource)314cdf0e10cSrcweir uno::Any ScVbaSheetObjectsBase::createCollectionObject( const uno::Any& rSource )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir return mxContainer->createCollectionObject( rSource );
317cdf0e10cSrcweir }
318cdf0e10cSrcweir
getItemByStringIndex(const OUString & rIndex)319cdf0e10cSrcweir uno::Any ScVbaSheetObjectsBase::getItemByStringIndex( const OUString& rIndex ) throw (uno::RuntimeException)
320cdf0e10cSrcweir {
321cdf0e10cSrcweir return mxContainer->getItemByStringIndex( rIndex );
322cdf0e10cSrcweir }
323cdf0e10cSrcweir
324cdf0e10cSrcweir // ============================================================================
325cdf0e10cSrcweir // Graphic object containers supporting ooo.vba.excel.XGraphicObject
326cdf0e10cSrcweir // ============================================================================
327cdf0e10cSrcweir
ScVbaGraphicObjectsBase(const ScVbaObjectContainerRef & rxContainer)328cdf0e10cSrcweir ScVbaGraphicObjectsBase::ScVbaGraphicObjectsBase( const ScVbaObjectContainerRef& rxContainer ) throw (uno::RuntimeException) :
329cdf0e10cSrcweir ScVbaGraphicObjects_BASE( rxContainer )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir }
332cdf0e10cSrcweir
333cdf0e10cSrcweir // XGraphicObjects
334cdf0e10cSrcweir
Add(const uno::Any & rLeft,const uno::Any & rTop,const uno::Any & rWidth,const uno::Any & rHeight)335cdf0e10cSrcweir uno::Any SAL_CALL ScVbaGraphicObjectsBase::Add( const uno::Any& rLeft, const uno::Any& rTop, const uno::Any& rWidth, const uno::Any& rHeight ) throw (uno::RuntimeException)
336cdf0e10cSrcweir {
337cdf0e10cSrcweir /* Extract double values from passed Anys (the lclPointsToHmm() helper
338cdf0e10cSrcweir function will throw a RuntimeException on any error), and convert from
339cdf0e10cSrcweir points to 1/100 mm. */
340cdf0e10cSrcweir awt::Point aPos( lclPointsToHmm( rLeft ), lclPointsToHmm( rTop ) );
341cdf0e10cSrcweir awt::Size aSize( lclPointsToHmm( rWidth ), lclPointsToHmm( rHeight ) );
342cdf0e10cSrcweir // TODO: translate coordinates for RTL sheets
343cdf0e10cSrcweir if( (aPos.X < 0) || (aPos.Y < 0) || (aSize.Width <= 0) || (aSize.Height <= 0) )
344cdf0e10cSrcweir throw uno::RuntimeException();
345cdf0e10cSrcweir
346cdf0e10cSrcweir // create the UNO shape
347cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape( mxContainer->createShape( aPos, aSize ), uno::UNO_SET_THROW );
348cdf0e10cSrcweir sal_Int32 nIndex = mxContainer->insertShape( xShape );
349cdf0e10cSrcweir
350cdf0e10cSrcweir // create and return the VBA object
351cdf0e10cSrcweir ::rtl::Reference< ScVbaSheetObjectBase > xVbaObject = mxContainer->createVbaObject( xShape );
352cdf0e10cSrcweir xVbaObject->setDefaultProperties( nIndex );
353cdf0e10cSrcweir return uno::Any( uno::Reference< excel::XSheetObject >( xVbaObject.get() ) );
354cdf0e10cSrcweir }
355cdf0e10cSrcweir
356cdf0e10cSrcweir // ============================================================================
357cdf0e10cSrcweir // Drawing controls
358cdf0e10cSrcweir // ============================================================================
359cdf0e10cSrcweir
360cdf0e10cSrcweir class ScVbaControlContainer : public ScVbaObjectContainer
361cdf0e10cSrcweir {
362cdf0e10cSrcweir public:
363cdf0e10cSrcweir explicit ScVbaControlContainer(
364cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
365cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
366cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
367cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet,
368cdf0e10cSrcweir const uno::Type& rVbaType,
369cdf0e10cSrcweir const OUString& rModelServiceName,
370cdf0e10cSrcweir sal_Int16 nComponentType ) throw (uno::RuntimeException);
371cdf0e10cSrcweir
372cdf0e10cSrcweir protected:
373cdf0e10cSrcweir uno::Reference< container::XIndexContainer > createForm() throw (uno::RuntimeException);
374cdf0e10cSrcweir
375cdf0e10cSrcweir virtual bool implPickShape( const uno::Reference< drawing::XShape >& rxShape ) const;
376cdf0e10cSrcweir virtual OUString implGetShapeServiceName() const;
377cdf0e10cSrcweir virtual bool implCheckProperties( const uno::Reference< beans::XPropertySet >& rxModelProps ) const;
378cdf0e10cSrcweir virtual OUString implGetShapeName( const uno::Reference< drawing::XShape >& rxShape ) const throw (uno::RuntimeException);
379cdf0e10cSrcweir virtual void implOnShapeCreated( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException);
380cdf0e10cSrcweir
381cdf0e10cSrcweir protected:
382cdf0e10cSrcweir uno::Reference< container::XIndexContainer > mxFormIC;
383cdf0e10cSrcweir OUString maModelServiceName;
384cdf0e10cSrcweir sal_Int16 mnComponentType;
385cdf0e10cSrcweir };
386cdf0e10cSrcweir
387cdf0e10cSrcweir // ----------------------------------------------------------------------------
388cdf0e10cSrcweir
ScVbaControlContainer(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<sheet::XSpreadsheet> & rxSheet,const uno::Type & rVbaType,const OUString & rModelServiceName,sal_Int16 nComponentType)389cdf0e10cSrcweir ScVbaControlContainer::ScVbaControlContainer(
390cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
391cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
392cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
393cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet,
394cdf0e10cSrcweir const uno::Type& rVbaType,
395cdf0e10cSrcweir const OUString& rModelServiceName,
396cdf0e10cSrcweir sal_Int16 nComponentType ) throw (uno::RuntimeException) :
397cdf0e10cSrcweir ScVbaObjectContainer( rxParent, rxContext, rxModel, rxSheet, rVbaType ),
398cdf0e10cSrcweir maModelServiceName( rModelServiceName ),
399cdf0e10cSrcweir mnComponentType( nComponentType )
400cdf0e10cSrcweir {
401cdf0e10cSrcweir }
402cdf0e10cSrcweir
createForm()403cdf0e10cSrcweir uno::Reference< container::XIndexContainer > ScVbaControlContainer::createForm() throw (uno::RuntimeException)
404cdf0e10cSrcweir {
405cdf0e10cSrcweir if( !mxFormIC.is() )
406cdf0e10cSrcweir {
407cdf0e10cSrcweir uno::Reference< form::XFormsSupplier > xFormsSupp( mxShapes, uno::UNO_QUERY_THROW );
408cdf0e10cSrcweir uno::Reference< container::XNameContainer > xFormsNC( xFormsSupp->getForms(), uno::UNO_SET_THROW );
409cdf0e10cSrcweir OUString aFormName = CREATE_OUSTRING( "Standard" );
410cdf0e10cSrcweir if( xFormsNC->hasByName( aFormName ) )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir mxFormIC.set( xFormsNC->getByName( aFormName ), uno::UNO_QUERY_THROW );
413cdf0e10cSrcweir }
414cdf0e10cSrcweir else
415cdf0e10cSrcweir {
416cdf0e10cSrcweir uno::Reference< form::XForm > xForm( mxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), uno::UNO_QUERY_THROW );
417cdf0e10cSrcweir xFormsNC->insertByName( aFormName, uno::Any( xForm ) );
418cdf0e10cSrcweir mxFormIC.set( xForm, uno::UNO_QUERY_THROW );
419cdf0e10cSrcweir }
420cdf0e10cSrcweir }
421cdf0e10cSrcweir return mxFormIC;
422cdf0e10cSrcweir }
423cdf0e10cSrcweir
implPickShape(const uno::Reference<drawing::XShape> & rxShape) const424cdf0e10cSrcweir bool ScVbaControlContainer::implPickShape( const uno::Reference< drawing::XShape >& rxShape ) const
425cdf0e10cSrcweir {
426cdf0e10cSrcweir try
427cdf0e10cSrcweir {
428cdf0e10cSrcweir uno::Reference< drawing::XControlShape > xControlShape( rxShape, uno::UNO_QUERY_THROW );
429cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xModelProps( xControlShape->getControl(), uno::UNO_QUERY_THROW );
430cdf0e10cSrcweir sal_Int16 nClassId = -1;
431cdf0e10cSrcweir return lclGetProperty( nClassId, xModelProps, CREATE_OUSTRING( "ClassId" ) ) &&
432cdf0e10cSrcweir (nClassId == mnComponentType) && implCheckProperties( xModelProps );
433cdf0e10cSrcweir }
434cdf0e10cSrcweir catch( uno::Exception& )
435cdf0e10cSrcweir {
436cdf0e10cSrcweir }
437cdf0e10cSrcweir return false;
438cdf0e10cSrcweir }
439cdf0e10cSrcweir
implGetShapeServiceName() const440cdf0e10cSrcweir OUString ScVbaControlContainer::implGetShapeServiceName() const
441cdf0e10cSrcweir {
442cdf0e10cSrcweir return CREATE_OUSTRING( "com.sun.star.drawing.ControlShape" );
443cdf0e10cSrcweir }
444cdf0e10cSrcweir
implCheckProperties(const uno::Reference<beans::XPropertySet> &) const445cdf0e10cSrcweir bool ScVbaControlContainer::implCheckProperties( const uno::Reference< beans::XPropertySet >& /*rxModelProps*/ ) const
446cdf0e10cSrcweir {
447cdf0e10cSrcweir return true;
448cdf0e10cSrcweir }
449cdf0e10cSrcweir
implGetShapeName(const uno::Reference<drawing::XShape> & rxShape) const450cdf0e10cSrcweir OUString ScVbaControlContainer::implGetShapeName( const uno::Reference< drawing::XShape >& rxShape ) const throw (uno::RuntimeException)
451cdf0e10cSrcweir {
452cdf0e10cSrcweir uno::Reference< drawing::XControlShape > xControlShape( rxShape, uno::UNO_QUERY_THROW );
453cdf0e10cSrcweir return uno::Reference< container::XNamed >( xControlShape->getControl(), uno::UNO_QUERY_THROW )->getName();
454cdf0e10cSrcweir }
455cdf0e10cSrcweir
implOnShapeCreated(const uno::Reference<drawing::XShape> & rxShape)456cdf0e10cSrcweir void ScVbaControlContainer::implOnShapeCreated( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException)
457cdf0e10cSrcweir {
458cdf0e10cSrcweir // passed shape must be a control shape
459cdf0e10cSrcweir uno::Reference< drawing::XControlShape > xControlShape( rxShape, uno::UNO_QUERY_THROW );
460cdf0e10cSrcweir
461cdf0e10cSrcweir // create the UNO control model
462cdf0e10cSrcweir uno::Reference< form::XFormComponent > xFormComponent( mxFactory->createInstance( maModelServiceName ), uno::UNO_QUERY_THROW );
463cdf0e10cSrcweir uno::Reference< awt::XControlModel > xControlModel( xFormComponent, uno::UNO_QUERY_THROW );
464cdf0e10cSrcweir
465cdf0e10cSrcweir // insert the control model into the form and the shape
466cdf0e10cSrcweir createForm();
467cdf0e10cSrcweir mxFormIC->insertByIndex( mxFormIC->getCount(), uno::Any( xFormComponent ) );
468cdf0e10cSrcweir xControlShape->setControl( xControlModel );
469cdf0e10cSrcweir }
470cdf0e10cSrcweir
471cdf0e10cSrcweir // ============================================================================
472cdf0e10cSrcweir // Push button
473cdf0e10cSrcweir // ============================================================================
474cdf0e10cSrcweir
475cdf0e10cSrcweir class ScVbaButtonContainer : public ScVbaControlContainer
476cdf0e10cSrcweir {
477cdf0e10cSrcweir public:
478cdf0e10cSrcweir explicit ScVbaButtonContainer(
479cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
480cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
481cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
482cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet ) throw (uno::RuntimeException);
483cdf0e10cSrcweir
484cdf0e10cSrcweir protected:
485cdf0e10cSrcweir virtual ScVbaSheetObjectBase* implCreateVbaObject( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException);
486cdf0e10cSrcweir virtual bool implCheckProperties( const uno::Reference< beans::XPropertySet >& rxModelProps ) const;
487cdf0e10cSrcweir };
488cdf0e10cSrcweir
489cdf0e10cSrcweir // ----------------------------------------------------------------------------
490cdf0e10cSrcweir
ScVbaButtonContainer(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<sheet::XSpreadsheet> & rxSheet)491cdf0e10cSrcweir ScVbaButtonContainer::ScVbaButtonContainer(
492cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
493cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
494cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
495cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet ) throw (uno::RuntimeException) :
496cdf0e10cSrcweir ScVbaControlContainer(
497cdf0e10cSrcweir rxParent, rxContext, rxModel, rxSheet,
498cdf0e10cSrcweir excel::XButton::static_type( 0 ),
499cdf0e10cSrcweir CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" ),
500cdf0e10cSrcweir form::FormComponentType::COMMANDBUTTON )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir }
503cdf0e10cSrcweir
implCreateVbaObject(const uno::Reference<drawing::XShape> & rxShape)504cdf0e10cSrcweir ScVbaSheetObjectBase* ScVbaButtonContainer::implCreateVbaObject( const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException)
505cdf0e10cSrcweir {
506cdf0e10cSrcweir uno::Reference< drawing::XControlShape > xControlShape( rxShape, uno::UNO_QUERY_THROW );
507cdf0e10cSrcweir return new ScVbaButton( mxParent, mxContext, mxModel, createForm(), xControlShape );
508cdf0e10cSrcweir }
509cdf0e10cSrcweir
implCheckProperties(const uno::Reference<beans::XPropertySet> & rxModelProps) const510cdf0e10cSrcweir bool ScVbaButtonContainer::implCheckProperties( const uno::Reference< beans::XPropertySet >& rxModelProps ) const
511cdf0e10cSrcweir {
512cdf0e10cSrcweir // do not insert toggle buttons into the 'Buttons' collection
513cdf0e10cSrcweir bool bToggle = false;
514cdf0e10cSrcweir return lclGetProperty( bToggle, rxModelProps, CREATE_OUSTRING( "Toggle" ) ) && !bToggle;
515cdf0e10cSrcweir }
516cdf0e10cSrcweir
517cdf0e10cSrcweir // ============================================================================
518cdf0e10cSrcweir
ScVbaButtons(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<sheet::XSpreadsheet> & rxSheet)519cdf0e10cSrcweir ScVbaButtons::ScVbaButtons(
520cdf0e10cSrcweir const uno::Reference< XHelperInterface >& rxParent,
521cdf0e10cSrcweir const uno::Reference< uno::XComponentContext >& rxContext,
522cdf0e10cSrcweir const uno::Reference< frame::XModel >& rxModel,
523cdf0e10cSrcweir const uno::Reference< sheet::XSpreadsheet >& rxSheet ) throw (uno::RuntimeException) :
524cdf0e10cSrcweir ScVbaGraphicObjectsBase( new ScVbaButtonContainer( rxParent, rxContext, rxModel, rxSheet ) )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir }
527cdf0e10cSrcweir
528cdf0e10cSrcweir VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaButtons, "ooo.vba.excel.Buttons" )
529cdf0e10cSrcweir
530cdf0e10cSrcweir // ============================================================================
531