1*e6ed5fbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*e6ed5fbcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*e6ed5fbcSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*e6ed5fbcSAndrew Rist * distributed with this work for additional information
6*e6ed5fbcSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*e6ed5fbcSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*e6ed5fbcSAndrew Rist * "License"); you may not use this file except in compliance
9*e6ed5fbcSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*e6ed5fbcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*e6ed5fbcSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*e6ed5fbcSAndrew Rist * software distributed under the License is distributed on an
15*e6ed5fbcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*e6ed5fbcSAndrew Rist * KIND, either express or implied. See the License for the
17*e6ed5fbcSAndrew Rist * specific language governing permissions and limitations
18*e6ed5fbcSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*e6ed5fbcSAndrew Rist *************************************************************/
21*e6ed5fbcSAndrew Rist
22*e6ed5fbcSAndrew Rist
23cdf0e10cSrcweir #include "vbacommandbarcontrol.hxx"
24cdf0e10cSrcweir #include "vbacommandbarcontrols.hxx"
25cdf0e10cSrcweir #include <vbahelper/vbahelper.hxx>
26cdf0e10cSrcweir #include <filter/msfilter/msvbahelper.hxx>
27cdf0e10cSrcweir
28cdf0e10cSrcweir using namespace com::sun::star;
29cdf0e10cSrcweir using namespace ooo::vba;
30cdf0e10cSrcweir
ScVbaCommandBarControl(const css::uno::Reference<ov::XHelperInterface> & xParent,const css::uno::Reference<css::uno::XComponentContext> & xContext,const css::uno::Reference<css::container::XIndexAccess> & xSettings,VbaCommandBarHelperRef pHelper,const css::uno::Reference<css::container::XIndexAccess> & xBarSettings,const rtl::OUString & sResourceUrl)31cdf0e10cSrcweir ScVbaCommandBarControl::ScVbaCommandBarControl( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::container::XIndexAccess >& xSettings, VbaCommandBarHelperRef pHelper, const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, const rtl::OUString& sResourceUrl ) throw (css::uno::RuntimeException) : CommandBarControl_BASE( xParent, xContext ), pCBarHelper( pHelper ), m_sResourceUrl( sResourceUrl ), m_xCurrentSettings( xSettings ), m_xBarSettings( xBarSettings ), m_nPosition( 0 ), m_bTemporary( sal_True )
32cdf0e10cSrcweir {
33cdf0e10cSrcweir }
34cdf0e10cSrcweir
ScVbaCommandBarControl(const css::uno::Reference<ov::XHelperInterface> & xParent,const css::uno::Reference<css::uno::XComponentContext> & xContext,const css::uno::Reference<css::container::XIndexAccess> & xSettings,VbaCommandBarHelperRef pHelper,const css::uno::Reference<css::container::XIndexAccess> & xBarSettings,const rtl::OUString & sResourceUrl,sal_Int32 nPosition,sal_Bool bTemporary)35cdf0e10cSrcweir ScVbaCommandBarControl::ScVbaCommandBarControl( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::container::XIndexAccess >& xSettings, VbaCommandBarHelperRef pHelper, const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, const rtl::OUString& sResourceUrl, sal_Int32 nPosition, sal_Bool bTemporary ) throw (css::uno::RuntimeException) : CommandBarControl_BASE( xParent, xContext ), pCBarHelper( pHelper ), m_sResourceUrl( sResourceUrl ), m_xCurrentSettings( xSettings ), m_xBarSettings( xBarSettings ), m_nPosition( nPosition ), m_bTemporary( bTemporary )
36cdf0e10cSrcweir {
37cdf0e10cSrcweir m_xCurrentSettings->getByIndex( nPosition ) >>= m_aPropertyValues;
38cdf0e10cSrcweir }
39cdf0e10cSrcweir
ApplyChange()40cdf0e10cSrcweir void ScVbaCommandBarControl::ApplyChange() throw ( uno::RuntimeException )
41cdf0e10cSrcweir {
42cdf0e10cSrcweir uno::Reference< container::XIndexContainer > xIndexContainer( m_xCurrentSettings, uno::UNO_QUERY_THROW );
43cdf0e10cSrcweir xIndexContainer->replaceByIndex( m_nPosition, uno::makeAny( m_aPropertyValues ) );
44cdf0e10cSrcweir pCBarHelper->ApplyChange( m_sResourceUrl, m_xBarSettings );
45cdf0e10cSrcweir }
46cdf0e10cSrcweir
47cdf0e10cSrcweir ::rtl::OUString SAL_CALL
getCaption()48cdf0e10cSrcweir ScVbaCommandBarControl::getCaption() throw ( uno::RuntimeException )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir // "Label" always empty
51cdf0e10cSrcweir rtl::OUString sCaption;
52cdf0e10cSrcweir getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("Label") ) >>= sCaption;
53cdf0e10cSrcweir return sCaption;
54cdf0e10cSrcweir }
55cdf0e10cSrcweir
56cdf0e10cSrcweir void SAL_CALL
setCaption(const::rtl::OUString & _caption)57cdf0e10cSrcweir ScVbaCommandBarControl::setCaption( const ::rtl::OUString& _caption ) throw (uno::RuntimeException)
58cdf0e10cSrcweir {
59cdf0e10cSrcweir rtl::OUString sCaption = _caption.replace('&','~');
60cdf0e10cSrcweir setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("Label"), uno::makeAny( sCaption ) );
61cdf0e10cSrcweir ApplyChange();
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
64cdf0e10cSrcweir ::rtl::OUString SAL_CALL
getOnAction()65cdf0e10cSrcweir ScVbaCommandBarControl::getOnAction() throw (uno::RuntimeException)
66cdf0e10cSrcweir {
67cdf0e10cSrcweir rtl::OUString sCommandURL;
68cdf0e10cSrcweir getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL") ) >>= sCommandURL;
69cdf0e10cSrcweir return sCommandURL;
70cdf0e10cSrcweir }
71cdf0e10cSrcweir
72cdf0e10cSrcweir void SAL_CALL
setOnAction(const::rtl::OUString & _onaction)73cdf0e10cSrcweir ScVbaCommandBarControl::setOnAction( const ::rtl::OUString& _onaction ) throw (uno::RuntimeException)
74cdf0e10cSrcweir {
75cdf0e10cSrcweir // get the current model
76cdf0e10cSrcweir uno::Reference< frame::XModel > xModel( pCBarHelper->getModel() );
77cdf0e10cSrcweir MacroResolvedInfo aResolvedMacro = ooo::vba::resolveVBAMacro( getSfxObjShell( xModel ), _onaction, true );
78cdf0e10cSrcweir if ( aResolvedMacro.mbFound )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir rtl::OUString aCommandURL = ooo::vba::makeMacroURL( aResolvedMacro.msResolvedMacro );
81cdf0e10cSrcweir OSL_TRACE(" ScVbaCommandBarControl::setOnAction: %s", rtl::OUStringToOString( aCommandURL, RTL_TEXTENCODING_UTF8 ).getStr() );
82cdf0e10cSrcweir setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL"), uno::makeAny( aCommandURL ) );
83cdf0e10cSrcweir ApplyChange();
84cdf0e10cSrcweir }
85cdf0e10cSrcweir }
86cdf0e10cSrcweir
87cdf0e10cSrcweir ::sal_Bool SAL_CALL
getVisible()88cdf0e10cSrcweir ScVbaCommandBarControl::getVisible() throw (uno::RuntimeException)
89cdf0e10cSrcweir {
90cdf0e10cSrcweir sal_Bool bVisible = sal_True;
91cdf0e10cSrcweir uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_ISVISIBLE ) );
92cdf0e10cSrcweir if( aValue.hasValue() )
93cdf0e10cSrcweir aValue >>= bVisible;
94cdf0e10cSrcweir return bVisible;
95cdf0e10cSrcweir }
96cdf0e10cSrcweir void SAL_CALL
setVisible(::sal_Bool _visible)97cdf0e10cSrcweir ScVbaCommandBarControl::setVisible( ::sal_Bool _visible ) throw (uno::RuntimeException)
98cdf0e10cSrcweir {
99cdf0e10cSrcweir uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_ISVISIBLE ) );
100cdf0e10cSrcweir if( aValue.hasValue() )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_ISVISIBLE ), uno::makeAny( _visible ) );
103cdf0e10cSrcweir ApplyChange();
104cdf0e10cSrcweir }
105cdf0e10cSrcweir }
106cdf0e10cSrcweir
107cdf0e10cSrcweir ::sal_Bool SAL_CALL
getEnabled()108cdf0e10cSrcweir ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir sal_Bool bEnabled = sal_True;
111cdf0e10cSrcweir
112cdf0e10cSrcweir uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_ENABLED ) );
113cdf0e10cSrcweir if( aValue.hasValue() )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir aValue >>= bEnabled;
116cdf0e10cSrcweir }
117cdf0e10cSrcweir else
118cdf0e10cSrcweir {
119cdf0e10cSrcweir // emulated with Visible
120cdf0e10cSrcweir bEnabled = getVisible();
121cdf0e10cSrcweir }
122cdf0e10cSrcweir return bEnabled;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir
125cdf0e10cSrcweir void SAL_CALL
setEnabled(sal_Bool _enabled)126cdf0e10cSrcweir ScVbaCommandBarControl::setEnabled( sal_Bool _enabled ) throw (uno::RuntimeException)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_ENABLED ) );
129cdf0e10cSrcweir if( aValue.hasValue() )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_ENABLED ), uno::makeAny( _enabled ) );
132cdf0e10cSrcweir ApplyChange();
133cdf0e10cSrcweir }
134cdf0e10cSrcweir else
135cdf0e10cSrcweir {
136cdf0e10cSrcweir // emulated with Visible
137cdf0e10cSrcweir setVisible( _enabled );
138cdf0e10cSrcweir }
139cdf0e10cSrcweir }
140cdf0e10cSrcweir
141cdf0e10cSrcweir ::sal_Bool SAL_CALL
getBeginGroup()142cdf0e10cSrcweir ScVbaCommandBarControl::getBeginGroup() throw (css::uno::RuntimeException)
143cdf0e10cSrcweir {
144cdf0e10cSrcweir // TODO: need to check if the item before this item is of type 'separator'
145cdf0e10cSrcweir return sal_False;
146cdf0e10cSrcweir }
147cdf0e10cSrcweir
148cdf0e10cSrcweir void SAL_CALL
setBeginGroup(::sal_Bool _begin)149cdf0e10cSrcweir ScVbaCommandBarControl::setBeginGroup( ::sal_Bool _begin ) throw (css::uno::RuntimeException)
150cdf0e10cSrcweir {
151cdf0e10cSrcweir if( getBeginGroup() != _begin )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir // TODO: need to insert or remove an item of type 'separator' before this item
154cdf0e10cSrcweir }
155cdf0e10cSrcweir }
156cdf0e10cSrcweir
157cdf0e10cSrcweir void SAL_CALL
Delete()158cdf0e10cSrcweir ScVbaCommandBarControl::Delete( ) throw (script::BasicErrorException, uno::RuntimeException)
159cdf0e10cSrcweir {
160cdf0e10cSrcweir if( m_xCurrentSettings.is() )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir uno::Reference< container::XIndexContainer > xIndexContainer( m_xCurrentSettings, uno::UNO_QUERY_THROW );
163cdf0e10cSrcweir xIndexContainer->removeByIndex( m_nPosition );
164cdf0e10cSrcweir
165cdf0e10cSrcweir pCBarHelper->ApplyChange( m_sResourceUrl, m_xBarSettings );
166cdf0e10cSrcweir }
167cdf0e10cSrcweir }
168cdf0e10cSrcweir
169cdf0e10cSrcweir uno::Any SAL_CALL
Controls(const uno::Any & aIndex)170cdf0e10cSrcweir ScVbaCommandBarControl::Controls( const uno::Any& aIndex ) throw (script::BasicErrorException, uno::RuntimeException)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir // only Popup Menu has controls
173cdf0e10cSrcweir uno::Reference< container::XIndexAccess > xSubMenu;
174cdf0e10cSrcweir getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii( ITEM_DESCRIPTOR_CONTAINER ) ) >>= xSubMenu;
175cdf0e10cSrcweir if( !xSubMenu.is() )
176cdf0e10cSrcweir throw uno::RuntimeException();
177cdf0e10cSrcweir
178cdf0e10cSrcweir uno::Reference< XCommandBarControls > xCommandBarControls( new ScVbaCommandBarControls( this, mxContext, xSubMenu, pCBarHelper, m_xBarSettings, m_sResourceUrl ) );
179cdf0e10cSrcweir if( aIndex.hasValue() )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir return xCommandBarControls->Item( aIndex, uno::Any() );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir return uno::makeAny( xCommandBarControls );
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir rtl::OUString&
getServiceImplName()187cdf0e10cSrcweir ScVbaCommandBarControl::getServiceImplName()
188cdf0e10cSrcweir {
189cdf0e10cSrcweir static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaCommandBarControl") );
190cdf0e10cSrcweir return sImplName;
191cdf0e10cSrcweir }
192cdf0e10cSrcweir
193cdf0e10cSrcweir uno::Sequence<rtl::OUString>
getServiceNames()194cdf0e10cSrcweir ScVbaCommandBarControl::getServiceNames()
195cdf0e10cSrcweir {
196cdf0e10cSrcweir static uno::Sequence< rtl::OUString > aServiceNames;
197cdf0e10cSrcweir if ( aServiceNames.getLength() == 0 )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir aServiceNames.realloc( 1 );
200cdf0e10cSrcweir aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.CommandBarControl" ) );
201cdf0e10cSrcweir }
202cdf0e10cSrcweir return aServiceNames;
203cdf0e10cSrcweir }
204cdf0e10cSrcweir
205cdf0e10cSrcweir //////////// ScVbaCommandBarPopup //////////////////////////////
ScVbaCommandBarPopup(const css::uno::Reference<ov::XHelperInterface> & xParent,const css::uno::Reference<css::uno::XComponentContext> & xContext,const css::uno::Reference<css::container::XIndexAccess> & xSettings,VbaCommandBarHelperRef pHelper,const css::uno::Reference<css::container::XIndexAccess> & xBarSettings,const rtl::OUString & sResourceUrl,sal_Int32 nPosition,sal_Bool bTemporary)206cdf0e10cSrcweir ScVbaCommandBarPopup::ScVbaCommandBarPopup( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::container::XIndexAccess >& xSettings, VbaCommandBarHelperRef pHelper, const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, const rtl::OUString& sResourceUrl, sal_Int32 nPosition, sal_Bool bTemporary ) throw (css::uno::RuntimeException) : CommandBarPopup_BASE( xParent, xContext, xSettings, pHelper, xBarSettings, sResourceUrl )
207cdf0e10cSrcweir {
208cdf0e10cSrcweir m_nPosition = nPosition;
209cdf0e10cSrcweir m_bTemporary = bTemporary;
210cdf0e10cSrcweir m_xCurrentSettings->getByIndex( m_nPosition ) >>= m_aPropertyValues;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
213cdf0e10cSrcweir rtl::OUString&
getServiceImplName()214cdf0e10cSrcweir ScVbaCommandBarPopup::getServiceImplName()
215cdf0e10cSrcweir {
216cdf0e10cSrcweir static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaCommandBarPopup") );
217cdf0e10cSrcweir return sImplName;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir uno::Sequence<rtl::OUString>
getServiceNames()220cdf0e10cSrcweir ScVbaCommandBarPopup::getServiceNames()
221cdf0e10cSrcweir {
222cdf0e10cSrcweir static uno::Sequence< rtl::OUString > aServiceNames;
223cdf0e10cSrcweir if ( aServiceNames.getLength() == 0 )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir aServiceNames.realloc( 1 );
226cdf0e10cSrcweir aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.CommandBarPopup" ) );
227cdf0e10cSrcweir }
228cdf0e10cSrcweir return aServiceNames;
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir //////////// ScVbaCommandBarButton //////////////////////////////
ScVbaCommandBarButton(const css::uno::Reference<ov::XHelperInterface> & xParent,const css::uno::Reference<css::uno::XComponentContext> & xContext,const css::uno::Reference<css::container::XIndexAccess> & xSettings,VbaCommandBarHelperRef pHelper,const css::uno::Reference<css::container::XIndexAccess> & xBarSettings,const rtl::OUString & sResourceUrl,sal_Int32 nPosition,sal_Bool bTemporary)232cdf0e10cSrcweir ScVbaCommandBarButton::ScVbaCommandBarButton( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::container::XIndexAccess >& xSettings, VbaCommandBarHelperRef pHelper, const css::uno::Reference< css::container::XIndexAccess >& xBarSettings, const rtl::OUString& sResourceUrl, sal_Int32 nPosition, sal_Bool bTemporary ) throw (css::uno::RuntimeException) : CommandBarButton_BASE( xParent, xContext, xSettings, pHelper, xBarSettings, sResourceUrl )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir m_nPosition = nPosition;
235cdf0e10cSrcweir m_bTemporary = bTemporary;
236cdf0e10cSrcweir m_xCurrentSettings->getByIndex( m_nPosition ) >>= m_aPropertyValues;
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
239cdf0e10cSrcweir rtl::OUString&
getServiceImplName()240cdf0e10cSrcweir ScVbaCommandBarButton::getServiceImplName()
241cdf0e10cSrcweir {
242cdf0e10cSrcweir static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaCommandBarButton") );
243cdf0e10cSrcweir return sImplName;
244cdf0e10cSrcweir }
245cdf0e10cSrcweir uno::Sequence<rtl::OUString>
getServiceNames()246cdf0e10cSrcweir ScVbaCommandBarButton::getServiceNames()
247cdf0e10cSrcweir {
248cdf0e10cSrcweir static uno::Sequence< rtl::OUString > aServiceNames;
249cdf0e10cSrcweir if ( aServiceNames.getLength() == 0 )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir aServiceNames.realloc( 1 );
252cdf0e10cSrcweir aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.CommandBarButton" ) );
253cdf0e10cSrcweir }
254cdf0e10cSrcweir return aServiceNames;
255cdf0e10cSrcweir }
256