Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <com/sun/star/awt/XControl.hpp>
21 : : #include <com/sun/star/awt/XControlContainer.hpp>
22 : : #include <com/sun/star/awt/FontWeight.hpp>
23 : : #include <com/sun/star/awt/FontSlant.hpp>
24 : : #include <com/sun/star/awt/FontStrikeout.hpp>
25 : : #include <com/sun/star/awt/FontUnderline.hpp>
26 : : #include <com/sun/star/container/XNameContainer.hpp>
27 : : #include <com/sun/star/script/XInvocation.hpp>
28 : : #include <com/sun/star/lang/WrappedTargetException.hpp>
29 : :
30 : : #include "vbacontrols.hxx"
31 : : #include "vbacontrol.hxx"
32 : : #include <cppuhelper/implbase2.hxx>
33 : : #include <ooo/vba/XControlProvider.hpp>
34 : : #include <boost/unordered_map.hpp>
35 : :
36 : : using namespace com::sun::star;
37 : : using namespace ooo::vba;
38 : :
39 : :
40 : : typedef ::cppu::WeakImplHelper2< container::XNameAccess, container::XIndexAccess > ArrayWrapImpl;
41 : :
42 : : typedef boost::unordered_map< rtl::OUString, sal_Int32, ::rtl::OUStringHash,
43 : : ::std::equal_to< ::rtl::OUString > > ControlIndexMap;
44 : : typedef std::vector< uno::Reference< awt::XControl > > ControlVec;
45 : :
46 : 0 : class ControlArrayWrapper : public ArrayWrapImpl
47 : : {
48 : : uno::Reference< awt::XControlContainer > mxDialog;
49 : : uno::Sequence< ::rtl::OUString > msNames;
50 : : ControlVec mControls;
51 : : ControlIndexMap mIndices;
52 : :
53 : : private:
54 : 0 : void SetArrayElementTo( const uno::Reference< awt::XControl >& xCtrl, sal_Int32 nIndex = -1 )
55 : : {
56 : : // initialize the element with specified index to the control
57 : 0 : if ( xCtrl.is() )
58 : : {
59 : 0 : if ( nIndex == -1 )
60 : 0 : nIndex = msNames.getLength();
61 : :
62 : 0 : if ( nIndex >= msNames.getLength() )
63 : 0 : msNames.realloc( nIndex );
64 : :
65 : 0 : msNames[ nIndex ] = getControlName( xCtrl );
66 : 0 : mControls.push_back( xCtrl );
67 : 0 : mIndices[ msNames[ nIndex ] ] = nIndex;
68 : : }
69 : 0 : }
70 : : void getNestedControls( ControlVec& vControls, uno::Reference< awt::XControlContainer >& xContainer )
71 : : {
72 : : uno::Sequence< uno::Reference< awt::XControl > > aControls = xContainer->getControls();
73 : : const uno::Reference< awt::XControl >* pCtrl = aControls.getConstArray();
74 : : const uno::Reference< awt::XControl >* pCtrlsEnd = pCtrl + aControls.getLength();
75 : : for ( ; pCtrl < pCtrlsEnd; ++pCtrl )
76 : : {
77 : : uno::Reference< awt::XControlContainer > xC( *pCtrl, uno::UNO_QUERY );
78 : : vControls.push_back( *pCtrl );
79 : : if ( xC.is() )
80 : : getNestedControls( vControls, xC );
81 : : }
82 : : }
83 : : public:
84 : 0 : ControlArrayWrapper( const uno::Reference< awt::XControl >& xDialog )
85 : 0 : {
86 : : try
87 : : {
88 : 0 : mxDialog.set( xDialog, uno::UNO_QUERY_THROW );
89 : 0 : uno::Sequence< uno::Reference< awt::XControl > > sXControls = mxDialog->getControls();
90 : :
91 : 0 : msNames.realloc( sXControls.getLength() );
92 : 0 : for ( sal_Int32 i = 0; i < sXControls.getLength(); ++i )
93 : 0 : SetArrayElementTo( sXControls[ i ], i );
94 : : }
95 : 0 : catch (const uno::Exception&)
96 : : {
97 : : // accept the case when the dialog already does not exist
98 : : // in this case the wrapper should work in dummy mode
99 : : }
100 : 0 : }
101 : :
102 : 0 : static rtl::OUString getControlName( const uno::Reference< awt::XControl >& xCtrl )
103 : : {
104 : 0 : if ( !xCtrl.is() )
105 : 0 : throw uno::RuntimeException();
106 : :
107 : 0 : uno::Reference< beans::XPropertySet > xProp( xCtrl->getModel(), uno::UNO_QUERY_THROW );
108 : 0 : rtl::OUString sName;
109 : 0 : xProp->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ) ) >>= sName;
110 : 0 : return sName;
111 : : }
112 : :
113 : :
114 : : // XElementAccess
115 : 0 : virtual uno::Type SAL_CALL getElementType( ) throw (uno::RuntimeException)
116 : : {
117 : 0 : return awt::XControl::static_type(0);
118 : : }
119 : :
120 : 0 : virtual ::sal_Bool SAL_CALL hasElements( ) throw (uno::RuntimeException)
121 : : {
122 : 0 : return ( !mControls.empty() );
123 : : }
124 : :
125 : : // XNameAcess
126 : 0 : virtual uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
127 : : {
128 : 0 : if ( !hasByName( aName ) )
129 : 0 : throw container::NoSuchElementException();
130 : 0 : return getByIndex( mIndices[ aName ] );
131 : : }
132 : :
133 : 0 : virtual uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw (uno::RuntimeException)
134 : : {
135 : 0 : return msNames;
136 : : }
137 : :
138 : 0 : virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (css::uno::RuntimeException)
139 : : {
140 : 0 : ControlIndexMap::iterator it = mIndices.find( aName );
141 : 0 : return it != mIndices.end();
142 : : }
143 : :
144 : : // XElementAccess
145 : 0 : virtual ::sal_Int32 SAL_CALL getCount( ) throw (css::uno::RuntimeException)
146 : : {
147 : 0 : return mControls.size();
148 : : }
149 : :
150 : 0 : virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
151 : : {
152 : 0 : if ( Index < 0 || Index >= static_cast< sal_Int32 >( mControls.size() ) )
153 : 0 : throw lang::IndexOutOfBoundsException();
154 : 0 : return uno::makeAny( mControls[ Index ] );
155 : : }
156 : : };
157 : :
158 : :
159 : 0 : class ControlsEnumWrapper : public EnumerationHelper_BASE
160 : : {
161 : : uno::Reference<XHelperInterface > m_xParent;
162 : : uno::Reference<uno::XComponentContext > m_xContext;
163 : : uno::Reference<container::XIndexAccess > m_xIndexAccess;
164 : : uno::Reference<awt::XControl > m_xDlg;
165 : : uno::Reference< frame::XModel > m_xModel;
166 : : double mfOffsetX;
167 : : double mfOffsetY;
168 : : sal_Int32 nIndex;
169 : :
170 : : public:
171 : :
172 : 0 : ControlsEnumWrapper(
173 : : const uno::Reference< XHelperInterface >& xParent,
174 : : const uno::Reference< uno::XComponentContext >& xContext,
175 : : const uno::Reference< container::XIndexAccess >& xIndexAccess,
176 : : const uno::Reference< awt::XControl >& xDlg,
177 : : const uno::Reference< frame::XModel >& xModel,
178 : : double fOffsetX, double fOffsetY ) :
179 : : m_xParent( xParent ),
180 : : m_xContext( xContext),
181 : : m_xIndexAccess( xIndexAccess ),
182 : : m_xDlg( xDlg ),
183 : : m_xModel( xModel ),
184 : : mfOffsetX( fOffsetX ),
185 : : mfOffsetY( fOffsetY ),
186 : 0 : nIndex( 0 ) {}
187 : :
188 : 0 : virtual ::sal_Bool SAL_CALL hasMoreElements( ) throw (uno::RuntimeException)
189 : : {
190 : 0 : return ( nIndex < m_xIndexAccess->getCount() );
191 : : }
192 : :
193 : 0 : virtual uno::Any SAL_CALL nextElement( ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
194 : : {
195 : 0 : if ( nIndex < m_xIndexAccess->getCount() )
196 : : {
197 : 0 : uno::Reference< awt::XControl > xControl;
198 : 0 : m_xIndexAccess->getByIndex( nIndex++ ) >>= xControl;
199 : :
200 : 0 : uno::Reference< msforms::XControl > xVBAControl;
201 : 0 : if ( xControl.is() && m_xDlg.is() )
202 : 0 : xVBAControl = ScVbaControlFactory::createUserformControl( m_xContext, xControl, m_xDlg, m_xModel, mfOffsetX, mfOffsetY );
203 : 0 : return uno::makeAny( xVBAControl );
204 : : }
205 : 0 : throw container::NoSuchElementException();
206 : : }
207 : :
208 : : };
209 : :
210 : :
211 : : uno::Reference<container::XIndexAccess >
212 : 0 : lcl_controlsWrapper( const uno::Reference< awt::XControl >& xDlg )
213 : : {
214 : 0 : return new ControlArrayWrapper( xDlg );
215 : : }
216 : :
217 : 0 : ScVbaControls::ScVbaControls(
218 : : const uno::Reference< XHelperInterface >& xParent,
219 : : const uno::Reference< uno::XComponentContext >& xContext,
220 : : const css::uno::Reference< awt::XControl >& xDialog,
221 : : const uno::Reference< frame::XModel >& xModel,
222 : : double fOffsetX, double fOffsetY ) :
223 : : ControlsImpl_BASE( xParent, xContext, lcl_controlsWrapper( xDialog ) ),
224 : : mxDialog( xDialog ),
225 : : mxModel( xModel ),
226 : : mfOffsetX( fOffsetX ),
227 : 0 : mfOffsetY( fOffsetY )
228 : : {
229 : 0 : }
230 : :
231 : : uno::Reference< container::XEnumeration >
232 : 0 : ScVbaControls::createEnumeration() throw (uno::RuntimeException)
233 : : {
234 : 0 : uno::Reference< container::XEnumeration > xEnum( new ControlsEnumWrapper( mxParent, mxContext, m_xIndexAccess, mxDialog, mxModel, mfOffsetX, mfOffsetY ) );
235 : 0 : if ( !xEnum.is() )
236 : 0 : throw uno::RuntimeException();
237 : 0 : return xEnum;
238 : : }
239 : :
240 : : uno::Any
241 : 0 : ScVbaControls::createCollectionObject( const css::uno::Any& aSource )
242 : : {
243 : : // Create control from awt::XControl
244 : 0 : uno::Reference< awt::XControl > xControl( aSource, uno::UNO_QUERY_THROW );
245 : 0 : uno::Reference< msforms::XControl > xVBAControl = ScVbaControlFactory::createUserformControl( mxContext, xControl, mxDialog, mxModel, mfOffsetX, mfOffsetY );
246 : 0 : return uno::Any( xVBAControl );
247 : : }
248 : :
249 : : void SAL_CALL
250 : 0 : ScVbaControls::Move( double cx, double cy ) throw (uno::RuntimeException)
251 : : {
252 : 0 : uno::Reference< container::XEnumeration > xEnum( createEnumeration() );
253 : 0 : while ( xEnum->hasMoreElements() )
254 : : {
255 : 0 : uno::Reference< msforms::XControl > xControl( xEnum->nextElement(), uno::UNO_QUERY_THROW );
256 : 0 : xControl->setLeft( xControl->getLeft() + cx );
257 : 0 : xControl->setTop( xControl->getTop() + cy );
258 : 0 : }
259 : 0 : }
260 : :
261 : 0 : uno::Any SAL_CALL ScVbaControls::Add( const uno::Any& Object, const uno::Any& StringKey, const uno::Any& /*Before*/, const uno::Any& /*After*/ )
262 : : throw (uno::RuntimeException)
263 : : {
264 : 0 : uno::Any aResult;
265 : 0 : ::rtl::OUString aComServiceName;
266 : :
267 : : try
268 : : {
269 : 0 : if ( !mxDialog.is() )
270 : 0 : throw uno::RuntimeException();
271 : :
272 : 0 : uno::Reference< awt::XControl > xNewControl;
273 : 0 : uno::Reference< lang::XMultiServiceFactory > xModelFactory( mxDialog->getModel(), uno::UNO_QUERY_THROW );
274 : :
275 : 0 : uno::Reference< container::XNameContainer > xDialogContainer( xModelFactory, uno::UNO_QUERY_THROW );
276 : :
277 : 0 : Object >>= aComServiceName;
278 : :
279 : : // TODO: Support Before and After?
280 : 0 : ::rtl::OUString aNewName;
281 : 0 : StringKey >>= aNewName;
282 : 0 : if ( aNewName.isEmpty() )
283 : : {
284 : 0 : aNewName = aComServiceName;
285 : 0 : if ( aNewName.isEmpty() )
286 : 0 : aNewName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Control" ) );
287 : :
288 : 0 : sal_Int32 nInd = 0;
289 : 0 : while( xDialogContainer->hasByName( aNewName ) && (nInd < SAL_MAX_INT32) )
290 : : {
291 : 0 : aNewName = aComServiceName;
292 : 0 : aNewName += ::rtl::OUString::valueOf( nInd++ );
293 : : }
294 : : }
295 : :
296 : 0 : double fDefWidth = 72.0, fDefHeight = 18.0;
297 : 0 : if ( !aComServiceName.isEmpty() )
298 : : {
299 : : // create a UNO control model based on the passed control type
300 : 0 : uno::Reference< awt::XControlModel > xNewModel;
301 : 0 : bool bFontSupport = false;
302 : 0 : bool bNativeAX = false;
303 : 0 : if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.CommandButton.1" ) ) )
304 : : {
305 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlButtonModel" ) ) ), uno::UNO_QUERY_THROW );
306 : 0 : fDefWidth = 72.0; fDefHeight = 24.0;
307 : 0 : bFontSupport = true;
308 : : }
309 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.Label.1" ) ) )
310 : : {
311 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFixedTextModel" ) ) ), uno::UNO_QUERY_THROW );
312 : 0 : fDefWidth = 72.0; fDefHeight = 18.0;
313 : 0 : bFontSupport = true;
314 : : }
315 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.Image.1" ) ) )
316 : : {
317 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlImageControlModel" ) ) ), uno::UNO_QUERY_THROW );
318 : 0 : fDefWidth = 72.0; fDefHeight = 72.0;
319 : : }
320 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.CheckBox.1" ) ) )
321 : : {
322 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlCheckBoxModel" ) ) ), uno::UNO_QUERY_THROW );
323 : 0 : fDefWidth = 108.0; fDefHeight = 18.0;
324 : 0 : bFontSupport = true;
325 : : }
326 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.OptionButton.1" ) ) )
327 : : {
328 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlRadioButtonModel" ) ) ), uno::UNO_QUERY_THROW );
329 : 0 : fDefWidth = 108.0; fDefHeight = 18.0;
330 : 0 : bFontSupport = true;
331 : : }
332 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.TextBox.1" ) ) )
333 : : {
334 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlEditModel" ) ) ), uno::UNO_QUERY_THROW );
335 : 0 : fDefWidth = 72.0; fDefHeight = 18.0;
336 : 0 : bFontSupport = true;
337 : : }
338 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.ListBox.1" ) ) )
339 : : {
340 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlListBoxModel" ) ) ), uno::UNO_QUERY_THROW );
341 : 0 : fDefWidth = 72.0; fDefHeight = 18.0;
342 : 0 : bFontSupport = true;
343 : : }
344 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.ComboBox.1" ) ) )
345 : : {
346 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlComboBoxModel" ) ) ), uno::UNO_QUERY_THROW );
347 : 0 : uno::Reference< beans::XPropertySet > xProps( xNewModel, uno::UNO_QUERY_THROW );
348 : 0 : xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Dropdown" ) ), uno::Any( true ) );
349 : 0 : fDefWidth = 72.0; fDefHeight = 18.0;
350 : 0 : bFontSupport = true;
351 : : }
352 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.ToggleButton.1" ) ) )
353 : : {
354 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlButtonModel" ) ) ), uno::UNO_QUERY_THROW );
355 : 0 : uno::Reference< beans::XPropertySet > xProps( xNewModel, uno::UNO_QUERY_THROW );
356 : 0 : xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Toggle" ) ), uno::Any( true ) );
357 : 0 : fDefWidth = 72.0; fDefHeight = 18.0;
358 : 0 : bFontSupport = true;
359 : : }
360 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.Frame.1" ) ) )
361 : : {
362 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlGroupBoxModel" ) ) ), uno::UNO_QUERY_THROW );
363 : 0 : fDefWidth = 216.0; fDefHeight = 144.0;
364 : 0 : bFontSupport = true;
365 : : }
366 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.SpinButton.1" ) ) )
367 : : {
368 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlSpinButtonModel" ) ) ), uno::UNO_QUERY_THROW );
369 : 0 : fDefWidth = 12.75; fDefHeight = 25.5;
370 : : }
371 : 0 : else if( aComServiceName.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "Forms.ScrollBar.1" ) ) )
372 : : {
373 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlScrollBarModel" ) ) ), uno::UNO_QUERY_THROW );
374 : 0 : fDefWidth = 12.75; fDefHeight = 63.8;
375 : : }
376 : : else
377 : : {
378 : 0 : xNewModel.set( xModelFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.custom.awt.UnoControlSystemAXContainerModel" ) ) ), uno::UNO_QUERY_THROW );
379 : 0 : fDefWidth = 72.0; fDefHeight = 18.0;
380 : 0 : bNativeAX = true;
381 : : }
382 : :
383 : : // need to set a few font properties to get rid of the default DONT_KNOW values
384 : 0 : if( bFontSupport )
385 : : {
386 : 0 : uno::Reference< beans::XPropertySet > xModelProps( xNewModel, uno::UNO_QUERY_THROW );
387 : 0 : xModelProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontName" ) ), uno::Any( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Tahoma" ) ) ) );
388 : 0 : xModelProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontHeight" ) ), uno::Any( float( 8.0 ) ) );
389 : 0 : xModelProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontWeight" ) ), uno::Any( awt::FontWeight::NORMAL ) );
390 : 0 : xModelProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontSlant" ) ), uno::Any( awt::FontSlant_NONE ) );
391 : 0 : xModelProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontUnderline" ) ), uno::Any( awt::FontUnderline::NONE ) );
392 : 0 : xModelProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontStrikeout" ) ), uno::Any( awt::FontStrikeout::NONE ) );
393 : : }
394 : :
395 : 0 : xDialogContainer->insertByName( aNewName, uno::makeAny( xNewModel ) );
396 : 0 : uno::Reference< awt::XControlContainer > xControlContainer( mxDialog, uno::UNO_QUERY_THROW );
397 : 0 : xNewControl = xControlContainer->getControl( aNewName );
398 : :
399 : 0 : if( bNativeAX ) try
400 : : {
401 : 0 : uno::Reference< script::XInvocation > xControlInvoke( xNewControl, uno::UNO_QUERY_THROW );
402 : :
403 : 0 : uno::Sequence< uno::Any > aArgs( 1 );
404 : 0 : aArgs[0] <<= aComServiceName;
405 : 0 : uno::Sequence< sal_Int16 > aOutIDDummy;
406 : 0 : uno::Sequence< uno::Any > aOutDummy;
407 : 0 : xControlInvoke->invoke( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SOAddAXControl" ) ), aArgs, aOutIDDummy, aOutDummy );
408 : : }
409 : 0 : catch (const uno::Exception&)
410 : : {
411 : 0 : xDialogContainer->removeByName( aNewName );
412 : 0 : throw;
413 : 0 : }
414 : : }
415 : :
416 : 0 : if ( xNewControl.is() )
417 : : {
418 : 0 : UpdateCollectionIndex( lcl_controlsWrapper( mxDialog ) );
419 : 0 : aResult <<= xNewControl;
420 : 0 : aResult = createCollectionObject( aResult );
421 : 0 : uno::Reference< msforms::XControl > xVBAControl( aResult, uno::UNO_QUERY_THROW );
422 : 0 : if( fDefWidth > 0.0 )
423 : 0 : xVBAControl->setWidth( fDefWidth );
424 : 0 : if( fDefHeight > 0.0 )
425 : 0 : xVBAControl->setHeight( fDefHeight );
426 : : }
427 : : else
428 : 0 : throw uno::RuntimeException();
429 : : }
430 : 0 : catch (const uno::RuntimeException&)
431 : : {
432 : 0 : throw;
433 : : }
434 : 0 : catch (const uno::Exception& e)
435 : : {
436 : : throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not create AXControl!" ) ),
437 : : uno::Reference< uno::XInterface >(),
438 : 0 : uno::makeAny( e ) );
439 : : }
440 : :
441 : 0 : return aResult;
442 : : }
443 : :
444 : 0 : void SAL_CALL ScVbaControls::Remove( const uno::Any& StringKeyOrIndex )
445 : : throw (uno::RuntimeException)
446 : : {
447 : 0 : ::rtl::OUString aControlName;
448 : 0 : sal_Int32 nIndex = -1;
449 : :
450 : : try
451 : : {
452 : 0 : if ( !mxDialog.is() )
453 : 0 : throw uno::RuntimeException();
454 : :
455 : 0 : uno::Reference< lang::XMultiServiceFactory > xModelFactory( mxDialog->getModel(), uno::UNO_QUERY_THROW );
456 : 0 : uno::Reference< container::XNameContainer > xDialogContainer( xModelFactory, uno::UNO_QUERY_THROW );
457 : :
458 : 0 : if ( !( ( StringKeyOrIndex >>= aControlName ) && !aControlName.isEmpty() )
459 : 0 : && !( ( StringKeyOrIndex >>= nIndex ) && nIndex >= 0 && nIndex < m_xIndexAccess->getCount() ) )
460 : 0 : throw uno::RuntimeException();
461 : :
462 : 0 : uno::Reference< awt::XControl > xControl;
463 : 0 : if ( !aControlName.isEmpty() )
464 : : {
465 : 0 : uno::Reference< awt::XControlContainer > xControlContainer( mxDialog, uno::UNO_QUERY_THROW );
466 : 0 : xControl = xControlContainer->getControl( aControlName );
467 : : }
468 : : else
469 : : {
470 : 0 : m_xIndexAccess->getByIndex( nIndex ) >>= xControl;
471 : : }
472 : :
473 : 0 : if ( !xControl.is() )
474 : 0 : throw uno::RuntimeException();
475 : :
476 : 0 : if ( aControlName.isEmpty() )
477 : 0 : aControlName = ControlArrayWrapper::getControlName( xControl );
478 : :
479 : 0 : xDialogContainer->removeByName( aControlName );
480 : 0 : xControl->dispose();
481 : : }
482 : 0 : catch (const uno::RuntimeException&)
483 : : {
484 : : // the exceptions are not rethrown, impossibility to find or remove the control is currently not reported
485 : : // since in most cases it means just that the controls is already not there, the VBA seems to do it in the same way
486 : :
487 : : // throw;
488 : : }
489 : 0 : catch (const uno::Exception&)
490 : : {
491 : : // throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not create AXControl!" ) ),
492 : : // uno::Reference< uno::XInterface >(),
493 : : // uno::makeAny( e ) );
494 : 0 : }
495 : 0 : }
496 : :
497 : :
498 : : uno::Type
499 : 0 : ScVbaControls::getElementType() throw (uno::RuntimeException)
500 : : {
501 : 0 : return ooo::vba::msforms::XControl::static_type(0);
502 : : }
503 : :
504 : 0 : VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaControls, "ooo.vba.msforms.Controls" )
505 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|