1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "vbahelper/vbaapplicationbase.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumeration.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XLayoutManager.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDesktop.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumerationAccess.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentInfoSupplier.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentProperties.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEmbeddedScripts.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow2.hpp>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <hash_map>
41*b1cdbd2cSJim Jagielski #include <filter/msfilter/msvbahelper.hxx>
42*b1cdbd2cSJim Jagielski #include <tools/datetime.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <basic/sbx.hxx>
45*b1cdbd2cSJim Jagielski #include <basic/sbstar.hxx>
46*b1cdbd2cSJim Jagielski #include <basic/sbuno.hxx>
47*b1cdbd2cSJim Jagielski #include <basic/sbmeth.hxx>
48*b1cdbd2cSJim Jagielski #include <basic/sbmod.hxx>
49*b1cdbd2cSJim Jagielski #include <basic/vbahelper.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #include "vbacommandbars.hxx"
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
54*b1cdbd2cSJim Jagielski using namespace ::ooo::vba;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski #define OFFICEVERSION "11.0"
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski // ====VbaTimerInfo==================================
59*b1cdbd2cSJim Jagielski typedef ::std::pair< ::rtl::OUString, ::std::pair< double, double > > VbaTimerInfo;
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski // ====VbaTimer==================================
62*b1cdbd2cSJim Jagielski class VbaTimer
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski     Timer m_aTimer;
65*b1cdbd2cSJim Jagielski     VbaTimerInfo m_aTimerInfo;
66*b1cdbd2cSJim Jagielski     ::rtl::Reference< VbaApplicationBase > m_xBase;
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski     // the following declarations are here to prevent the usage of them
69*b1cdbd2cSJim Jagielski     VbaTimer( const VbaTimer& );
70*b1cdbd2cSJim Jagielski     VbaTimer& operator=( const VbaTimer& );
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski public:
VbaTimer()73*b1cdbd2cSJim Jagielski     VbaTimer()
74*b1cdbd2cSJim Jagielski     {}
75*b1cdbd2cSJim Jagielski 
~VbaTimer()76*b1cdbd2cSJim Jagielski     virtual ~VbaTimer()
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         m_aTimer.Stop();
79*b1cdbd2cSJim Jagielski     }
80*b1cdbd2cSJim Jagielski 
GetNow()81*b1cdbd2cSJim Jagielski     static double GetNow()
82*b1cdbd2cSJim Jagielski     {
83*b1cdbd2cSJim Jagielski         Date aDateNow;
84*b1cdbd2cSJim Jagielski         Time aTimeNow;
85*b1cdbd2cSJim Jagielski      	Date aRefDate( 1,1,1900 );
86*b1cdbd2cSJim Jagielski         long nDiffDays = (long)(aDateNow - aRefDate);
87*b1cdbd2cSJim Jagielski         nDiffDays += 2; // Anpassung VisualBasic: 1.Jan.1900 == 2
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski         long nDiffSeconds = aTimeNow.GetHour() * 3600 + aTimeNow.GetMin() * 60 + aTimeNow.GetSec();
90*b1cdbd2cSJim Jagielski         return (double)nDiffDays + ((double)nDiffSeconds)/(double)(24*3600);
91*b1cdbd2cSJim Jagielski     }
92*b1cdbd2cSJim Jagielski 
GetTimerMiliseconds(double nFrom,double nTo)93*b1cdbd2cSJim Jagielski     static sal_Int32 GetTimerMiliseconds( double nFrom, double nTo )
94*b1cdbd2cSJim Jagielski     {
95*b1cdbd2cSJim Jagielski         double nResult = nTo - nFrom;
96*b1cdbd2cSJim Jagielski         if ( nResult > 0 )
97*b1cdbd2cSJim Jagielski             nResult *= 24*3600*1000;
98*b1cdbd2cSJim Jagielski         else
99*b1cdbd2cSJim Jagielski             nResult = 50;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         return (sal_Int32) nResult;
102*b1cdbd2cSJim Jagielski     }
103*b1cdbd2cSJim Jagielski 
Start(const::rtl::Reference<VbaApplicationBase> xBase,const::rtl::OUString & aFunction,double nFrom,double nTo)104*b1cdbd2cSJim Jagielski     void Start( const ::rtl::Reference< VbaApplicationBase > xBase, const ::rtl::OUString& aFunction, double nFrom, double nTo )
105*b1cdbd2cSJim Jagielski     {
106*b1cdbd2cSJim Jagielski         if ( !xBase.is() || !aFunction.getLength() )
107*b1cdbd2cSJim Jagielski             throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Unexpected arguments!" ) ), uno::Reference< uno::XInterface >() );
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski         m_xBase = xBase;
110*b1cdbd2cSJim Jagielski         m_aTimerInfo = VbaTimerInfo( aFunction, ::std::pair< double, double >( nFrom, nTo ) );
111*b1cdbd2cSJim Jagielski         m_aTimer.SetTimeoutHdl( LINK( this, VbaTimer, MacroCallHdl ) );
112*b1cdbd2cSJim Jagielski         m_aTimer.SetTimeout( GetTimerMiliseconds( GetNow(), nFrom ) );
113*b1cdbd2cSJim Jagielski         m_aTimer.Start();
114*b1cdbd2cSJim Jagielski     }
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     DECL_LINK( MacroCallHdl, void* );
117*b1cdbd2cSJim Jagielski };
118*b1cdbd2cSJim Jagielski 
IMPL_LINK(VbaTimer,MacroCallHdl,void *,EMPTYARG)119*b1cdbd2cSJim Jagielski IMPL_LINK( VbaTimer, MacroCallHdl, void*, EMPTYARG )
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski     if ( m_aTimerInfo.second.second == 0 || GetNow() < m_aTimerInfo.second.second )
122*b1cdbd2cSJim Jagielski     {
123*b1cdbd2cSJim Jagielski         uno::Any aDummyArg;
124*b1cdbd2cSJim Jagielski         try
125*b1cdbd2cSJim Jagielski         {
126*b1cdbd2cSJim Jagielski             m_xBase->Run( m_aTimerInfo.first, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg, aDummyArg );
127*b1cdbd2cSJim Jagielski         }
128*b1cdbd2cSJim Jagielski         catch( uno::Exception& )
129*b1cdbd2cSJim Jagielski         {}
130*b1cdbd2cSJim Jagielski     }
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     // mast be the last call in the method since it deletes the timer
133*b1cdbd2cSJim Jagielski     try
134*b1cdbd2cSJim Jagielski     {
135*b1cdbd2cSJim Jagielski         m_xBase->OnTime( uno::makeAny( m_aTimerInfo.second.first ), m_aTimerInfo.first, uno::makeAny( m_aTimerInfo.second.second ), uno::makeAny( sal_False ) );
136*b1cdbd2cSJim Jagielski     } catch( uno::Exception& )
137*b1cdbd2cSJim Jagielski     {}
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski     return 0;
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski // ====VbaTimerInfoHash==================================
143*b1cdbd2cSJim Jagielski struct VbaTimerInfoHash
144*b1cdbd2cSJim Jagielski {
operator ()VbaTimerInfoHash145*b1cdbd2cSJim Jagielski     size_t operator()( const VbaTimerInfo& rTimerInfo ) const
146*b1cdbd2cSJim Jagielski     {
147*b1cdbd2cSJim Jagielski         return (size_t)rTimerInfo.first.hashCode()
148*b1cdbd2cSJim Jagielski              + (size_t)rtl_str_hashCode_WithLength( (char*)&rTimerInfo.second.first, sizeof( double ) )
149*b1cdbd2cSJim Jagielski              + (size_t)rtl_str_hashCode_WithLength( (char*)&rTimerInfo.second.second, sizeof( double ) );
150*b1cdbd2cSJim Jagielski     }
151*b1cdbd2cSJim Jagielski };
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski // ====VbaTimerHashMap==================================
154*b1cdbd2cSJim Jagielski typedef ::std::hash_map< VbaTimerInfo, VbaTimer*, VbaTimerInfoHash, ::std::equal_to< VbaTimerInfo > > VbaTimerHashMap;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski // ====VbaApplicationBase_Impl==================================
157*b1cdbd2cSJim Jagielski struct VbaApplicationBase_Impl
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski     VbaTimerHashMap m_aTimerHash;
160*b1cdbd2cSJim Jagielski     sal_Bool mbVisible;
161*b1cdbd2cSJim Jagielski 
VbaApplicationBase_ImplVbaApplicationBase_Impl162*b1cdbd2cSJim Jagielski     inline VbaApplicationBase_Impl() : mbVisible( sal_True ) {}
163*b1cdbd2cSJim Jagielski 
~VbaApplicationBase_ImplVbaApplicationBase_Impl164*b1cdbd2cSJim Jagielski     virtual ~VbaApplicationBase_Impl()
165*b1cdbd2cSJim Jagielski     {
166*b1cdbd2cSJim Jagielski         // remove the remaining timers
167*b1cdbd2cSJim Jagielski         for ( VbaTimerHashMap::iterator aIter = m_aTimerHash.begin();
168*b1cdbd2cSJim Jagielski               aIter != m_aTimerHash.end();
169*b1cdbd2cSJim Jagielski               aIter++ )
170*b1cdbd2cSJim Jagielski         {
171*b1cdbd2cSJim Jagielski             delete aIter->second;
172*b1cdbd2cSJim Jagielski             aIter->second = NULL;
173*b1cdbd2cSJim Jagielski         }
174*b1cdbd2cSJim Jagielski     }
175*b1cdbd2cSJim Jagielski };
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski // ====VbaApplicationBase==================================
VbaApplicationBase(const uno::Reference<uno::XComponentContext> & xContext)178*b1cdbd2cSJim Jagielski VbaApplicationBase::VbaApplicationBase( const uno::Reference< uno::XComponentContext >& xContext )
179*b1cdbd2cSJim Jagielski                     : ApplicationBase_BASE( uno::Reference< XHelperInterface >(), xContext )
180*b1cdbd2cSJim Jagielski                     , m_pImpl( new VbaApplicationBase_Impl )
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
~VbaApplicationBase()184*b1cdbd2cSJim Jagielski VbaApplicationBase::~VbaApplicationBase()
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski     delete m_pImpl;
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL
getScreenUpdating()190*b1cdbd2cSJim Jagielski VbaApplicationBase::getScreenUpdating() throw (uno::RuntimeException)
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
193*b1cdbd2cSJim Jagielski 	return !xModel->hasControllersLocked();
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski void SAL_CALL
setScreenUpdating(sal_Bool bUpdate)197*b1cdbd2cSJim Jagielski VbaApplicationBase::setScreenUpdating(sal_Bool bUpdate) throw (uno::RuntimeException)
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
200*b1cdbd2cSJim Jagielski     // #163808# use helper from module "basic" to lock all documents of this application
201*b1cdbd2cSJim Jagielski     ::basic::vba::lockControllersOfAllDocuments( xModel, !bUpdate );
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL
getDisplayStatusBar()205*b1cdbd2cSJim Jagielski VbaApplicationBase::getDisplayStatusBar() throw (uno::RuntimeException)
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
208*b1cdbd2cSJim Jagielski     uno::Reference< frame::XFrame > xFrame( xModel->getCurrentController()->getFrame(), uno::UNO_QUERY_THROW );
209*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xProps( xFrame, uno::UNO_QUERY_THROW );
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski     if( xProps.is() ){
212*b1cdbd2cSJim Jagielski         uno::Reference< frame::XLayoutManager > xLayoutManager( xProps->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LayoutManager")) ), uno::UNO_QUERY_THROW );
213*b1cdbd2cSJim Jagielski         rtl::OUString url(RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" ));
214*b1cdbd2cSJim Jagielski         if( xLayoutManager.is() && xLayoutManager->isElementVisible( url ) ){
215*b1cdbd2cSJim Jagielski             return sal_True;
216*b1cdbd2cSJim Jagielski         }
217*b1cdbd2cSJim Jagielski     }
218*b1cdbd2cSJim Jagielski     return sal_False;
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski void SAL_CALL
setDisplayStatusBar(sal_Bool bDisplayStatusBar)222*b1cdbd2cSJim Jagielski VbaApplicationBase::setDisplayStatusBar(sal_Bool bDisplayStatusBar) throw (uno::RuntimeException)
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
225*b1cdbd2cSJim Jagielski     uno::Reference< frame::XFrame > xFrame( xModel->getCurrentController()->getFrame(), uno::UNO_QUERY_THROW );
226*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xProps( xFrame, uno::UNO_QUERY_THROW );
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski     if( xProps.is() ){
229*b1cdbd2cSJim Jagielski         uno::Reference< frame::XLayoutManager > xLayoutManager( xProps->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LayoutManager")) ), uno::UNO_QUERY_THROW );
230*b1cdbd2cSJim Jagielski         rtl::OUString url(RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" ));
231*b1cdbd2cSJim Jagielski         if( xLayoutManager.is() ){
232*b1cdbd2cSJim Jagielski             if( bDisplayStatusBar && !xLayoutManager->isElementVisible( url ) ){
233*b1cdbd2cSJim Jagielski                 if( !xLayoutManager->showElement( url ) )
234*b1cdbd2cSJim Jagielski                     xLayoutManager->createElement( url );
235*b1cdbd2cSJim Jagielski                 return;
236*b1cdbd2cSJim Jagielski             }
237*b1cdbd2cSJim Jagielski             else if( !bDisplayStatusBar && xLayoutManager->isElementVisible( url ) ){
238*b1cdbd2cSJim Jagielski                 xLayoutManager->hideElement( url );
239*b1cdbd2cSJim Jagielski                 return;
240*b1cdbd2cSJim Jagielski             }
241*b1cdbd2cSJim Jagielski         }
242*b1cdbd2cSJim Jagielski     }
243*b1cdbd2cSJim Jagielski     return;
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski 
getInteractive()246*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL VbaApplicationBase::getInteractive()
247*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
250*b1cdbd2cSJim Jagielski     uno::Reference< frame::XFrame > xFrame( xModel->getCurrentController()->getFrame(), uno::UNO_QUERY_THROW );
251*b1cdbd2cSJim Jagielski     uno::Reference< awt::XWindow2 > xWindow( xFrame->getContainerWindow(), uno::UNO_QUERY_THROW );
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski     return xWindow->isEnabled();
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
setInteractive(::sal_Bool bInteractive)256*b1cdbd2cSJim Jagielski void SAL_CALL VbaApplicationBase::setInteractive( ::sal_Bool bInteractive )
257*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
260*b1cdbd2cSJim Jagielski     // #163808# use helper from module "basic" to enable/disable all container windows of all documents of this application
261*b1cdbd2cSJim Jagielski     ::basic::vba::enableContainerWindowsOfAllDocuments( xModel, bInteractive );
262*b1cdbd2cSJim Jagielski }
263*b1cdbd2cSJim Jagielski 
getVisible()264*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL VbaApplicationBase::getVisible() throw (uno::RuntimeException)
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski     return m_pImpl->mbVisible;    // dummy implementation
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
setVisible(sal_Bool bVisible)269*b1cdbd2cSJim Jagielski void SAL_CALL VbaApplicationBase::setVisible( sal_Bool bVisible ) throw (uno::RuntimeException)
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski     m_pImpl->mbVisible = bVisible;  // dummy implementation
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski uno::Any SAL_CALL
CommandBars(const uno::Any & aIndex)275*b1cdbd2cSJim Jagielski VbaApplicationBase::CommandBars( const uno::Any& aIndex ) throw (uno::RuntimeException)
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski     uno::Reference< XCommandBars > xCommandBars( new ScVbaCommandBars( this, mxContext, uno::Reference< container::XIndexAccess >(), getCurrentDocument() ) );
278*b1cdbd2cSJim Jagielski     if( aIndex.hasValue() )
279*b1cdbd2cSJim Jagielski         return uno::makeAny( xCommandBars->Item( aIndex, uno::Any() ) );
280*b1cdbd2cSJim Jagielski     return uno::makeAny( xCommandBars );
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL
getVersion()284*b1cdbd2cSJim Jagielski VbaApplicationBase::getVersion() throw (uno::RuntimeException)
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski 	return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(OFFICEVERSION));
287*b1cdbd2cSJim Jagielski }
288*b1cdbd2cSJim Jagielski 
Run(const::rtl::OUString & MacroName,const uno::Any & varg1,const uno::Any & varg2,const uno::Any & varg3,const uno::Any & varg4,const uno::Any & varg5,const uno::Any & varg6,const uno::Any & varg7,const uno::Any & varg8,const uno::Any & varg9,const uno::Any & varg10,const uno::Any & varg11,const uno::Any & varg12,const uno::Any & varg13,const uno::Any & varg14,const uno::Any & varg15,const uno::Any & varg16,const uno::Any & varg17,const uno::Any & varg18,const uno::Any & varg19,const uno::Any & varg20,const uno::Any & varg21,const uno::Any & varg22,const uno::Any & varg23,const uno::Any & varg24,const uno::Any & varg25,const uno::Any & varg26,const uno::Any & varg27,const uno::Any & varg28,const uno::Any & varg29,const uno::Any & varg30)289*b1cdbd2cSJim Jagielski uno::Any SAL_CALL VbaApplicationBase::Run( const ::rtl::OUString& MacroName, const uno::Any& varg1, const uno::Any& varg2, const uno::Any& varg3, const uno::Any& varg4, const uno::Any& varg5, const uno::Any& varg6, const uno::Any& varg7, const uno::Any& varg8, const uno::Any& varg9, const uno::Any& varg10, const uno::Any& varg11, const uno::Any& varg12, const uno::Any& varg13, const uno::Any& varg14, const uno::Any& varg15, const uno::Any& varg16, const uno::Any& varg17, const uno::Any& varg18, const uno::Any& varg19, const uno::Any& varg20, const uno::Any& varg21, const uno::Any& varg22, const uno::Any& varg23, const uno::Any& varg24, const uno::Any& varg25, const uno::Any& varg26, const uno::Any& varg27, const uno::Any& varg28, const uno::Any& varg29, const uno::Any& varg30 ) throw (uno::RuntimeException)
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski 	::rtl::OUString aMacroName = MacroName.trim();
292*b1cdbd2cSJim Jagielski 	if (0 == aMacroName.indexOf('!'))
293*b1cdbd2cSJim Jagielski 		aMacroName = aMacroName.copy(1).trim();
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski     uno::Reference< frame::XModel > xModel;
296*b1cdbd2cSJim Jagielski     SbMethod* pMeth = StarBASIC::GetActiveMethod();
297*b1cdbd2cSJim Jagielski     if ( pMeth )
298*b1cdbd2cSJim Jagielski     {
299*b1cdbd2cSJim Jagielski         SbModule* pMod = dynamic_cast< SbModule* >( pMeth->GetParent() );
300*b1cdbd2cSJim Jagielski         if ( pMod )
301*b1cdbd2cSJim Jagielski             xModel = StarBASIC::GetModelFromBasic( pMod );
302*b1cdbd2cSJim Jagielski     }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski     if ( !xModel.is() )
305*b1cdbd2cSJim Jagielski         xModel = getCurrentDocument();
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 	MacroResolvedInfo aMacroInfo = resolveVBAMacro( getSfxObjShell( xModel ), aMacroName );
308*b1cdbd2cSJim Jagielski     if( aMacroInfo.mbFound )
309*b1cdbd2cSJim Jagielski     {
310*b1cdbd2cSJim Jagielski         // handle the arguments
311*b1cdbd2cSJim Jagielski         const uno::Any* aArgsPtrArray[] = { &varg1, &varg2, &varg3, &varg4, &varg5, &varg6, &varg7, &varg8, &varg9, &varg10, &varg11, &varg12, &varg13, &varg14, &varg15, &varg16, &varg17, &varg18, &varg19, &varg20, &varg21, &varg22, &varg23, &varg24, &varg25, &varg26, &varg27, &varg28, &varg29, &varg30 };
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski         int nArg = sizeof( aArgsPtrArray ) / sizeof( aArgsPtrArray[0] );
314*b1cdbd2cSJim Jagielski         uno::Sequence< uno::Any > aArgs( nArg );
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski         const uno::Any** pArg = aArgsPtrArray;
317*b1cdbd2cSJim Jagielski         const uno::Any** pArgEnd = ( aArgsPtrArray + nArg );
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski         sal_Int32 nLastArgWithValue = 0;
320*b1cdbd2cSJim Jagielski         sal_Int32 nArgProcessed = 0;
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski         for ( ; pArg != pArgEnd; ++pArg, ++nArgProcessed )
323*b1cdbd2cSJim Jagielski         {
324*b1cdbd2cSJim Jagielski             aArgs[ nArgProcessed ] =  **pArg;
325*b1cdbd2cSJim Jagielski             if( (*pArg)->hasValue() )
326*b1cdbd2cSJim Jagielski                 nLastArgWithValue = nArgProcessed;
327*b1cdbd2cSJim Jagielski         }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski         // resize array to position of last param with value
330*b1cdbd2cSJim Jagielski         aArgs.realloc( nArgProcessed + 1 );
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski         uno::Any aRet;
333*b1cdbd2cSJim Jagielski         uno::Any aDummyCaller;
334*b1cdbd2cSJim Jagielski         executeMacro( aMacroInfo.mpDocContext, aMacroInfo.msResolvedMacro, aArgs, aRet, aDummyCaller );
335*b1cdbd2cSJim Jagielski 		return aRet;
336*b1cdbd2cSJim Jagielski     }
337*b1cdbd2cSJim Jagielski     else
338*b1cdbd2cSJim Jagielski     {
339*b1cdbd2cSJim Jagielski         throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("The macro doesn't exist") ), uno::Reference< uno::XInterface >() );
340*b1cdbd2cSJim Jagielski     }
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski 
OnTime(const uno::Any & aEarliestTime,const::rtl::OUString & aFunction,const uno::Any & aLatestTime,const uno::Any & aSchedule)343*b1cdbd2cSJim Jagielski void SAL_CALL VbaApplicationBase::OnTime( const uno::Any& aEarliestTime, const ::rtl::OUString& aFunction, const uno::Any& aLatestTime, const uno::Any& aSchedule )
344*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski     if ( !aFunction.getLength() )
347*b1cdbd2cSJim Jagielski         throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Unexpected function name!" ) ), uno::Reference< uno::XInterface >() );
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski     double nEarliestTime = 0;
350*b1cdbd2cSJim Jagielski     double nLatestTime = 0;
351*b1cdbd2cSJim Jagielski     if ( !( aEarliestTime >>= nEarliestTime )
352*b1cdbd2cSJim Jagielski       || ( aLatestTime.hasValue() && !( aLatestTime >>= nLatestTime ) ) )
353*b1cdbd2cSJim Jagielski         throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Only double is supported as time for now!" ) ), uno::Reference< uno::XInterface >() );
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski     sal_Bool bSetTimer = sal_True;
356*b1cdbd2cSJim Jagielski     aSchedule >>= bSetTimer;
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     VbaTimerInfo aTimerIndex( aFunction, ::std::pair< double, double >( nEarliestTime, nLatestTime ) );
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski     VbaTimerHashMap::iterator aIter = m_pImpl->m_aTimerHash.find( aTimerIndex );
361*b1cdbd2cSJim Jagielski     if ( aIter != m_pImpl->m_aTimerHash.end() )
362*b1cdbd2cSJim Jagielski     {
363*b1cdbd2cSJim Jagielski         delete aIter->second;
364*b1cdbd2cSJim Jagielski         aIter->second = NULL;
365*b1cdbd2cSJim Jagielski         m_pImpl->m_aTimerHash.erase( aIter );
366*b1cdbd2cSJim Jagielski     }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski     if ( bSetTimer )
369*b1cdbd2cSJim Jagielski     {
370*b1cdbd2cSJim Jagielski         VbaTimer* pTimer = new VbaTimer;
371*b1cdbd2cSJim Jagielski         m_pImpl->m_aTimerHash[ aTimerIndex ] = pTimer;
372*b1cdbd2cSJim Jagielski         pTimer->Start( this, aFunction, nEarliestTime, nLatestTime );
373*b1cdbd2cSJim Jagielski     }
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
CentimetersToPoints(float _Centimeters)376*b1cdbd2cSJim Jagielski float SAL_CALL VbaApplicationBase::CentimetersToPoints( float _Centimeters ) throw (uno::RuntimeException)
377*b1cdbd2cSJim Jagielski {
378*b1cdbd2cSJim Jagielski     // i cm = 28.35 points
379*b1cdbd2cSJim Jagielski     static const float rate = 28.35f;
380*b1cdbd2cSJim Jagielski     return ( _Centimeters * rate );
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski 
getVBE()383*b1cdbd2cSJim Jagielski uno::Any SAL_CALL VbaApplicationBase::getVBE() throw (uno::RuntimeException)
384*b1cdbd2cSJim Jagielski {
385*b1cdbd2cSJim Jagielski 	try // return empty object on error
386*b1cdbd2cSJim Jagielski 	{
387*b1cdbd2cSJim Jagielski         // "VBE" object does not have a parent, but pass document model to be able to determine application type
388*b1cdbd2cSJim Jagielski 		uno::Sequence< uno::Any > aArgs( 1 );
389*b1cdbd2cSJim Jagielski 		aArgs[ 0 ] <<= getCurrentDocument();
390*b1cdbd2cSJim Jagielski         uno::Reference< lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_SET_THROW );
391*b1cdbd2cSJim Jagielski 		uno::Reference< uno::XInterface > xVBE = xServiceManager->createInstanceWithArgumentsAndContext(
392*b1cdbd2cSJim Jagielski             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.vbide.VBE" ) ), aArgs, mxContext );
393*b1cdbd2cSJim Jagielski         return uno::Any( xVBE );
394*b1cdbd2cSJim Jagielski 	}
395*b1cdbd2cSJim Jagielski     catch( uno::Exception& )
396*b1cdbd2cSJim Jagielski 	{
397*b1cdbd2cSJim Jagielski 	}
398*b1cdbd2cSJim Jagielski 	return uno::Any();
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski rtl::OUString&
getServiceImplName()402*b1cdbd2cSJim Jagielski VbaApplicationBase::getServiceImplName()
403*b1cdbd2cSJim Jagielski {
404*b1cdbd2cSJim Jagielski 	static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("VbaApplicationBase") );
405*b1cdbd2cSJim Jagielski 	return sImplName;
406*b1cdbd2cSJim Jagielski }
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString>
getServiceNames()409*b1cdbd2cSJim Jagielski VbaApplicationBase::getServiceNames()
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski 	static uno::Sequence< rtl::OUString > aServiceNames;
412*b1cdbd2cSJim Jagielski 	if ( aServiceNames.getLength() == 0 )
413*b1cdbd2cSJim Jagielski 	{
414*b1cdbd2cSJim Jagielski 		aServiceNames.realloc( 1 );
415*b1cdbd2cSJim Jagielski 		aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.VbaApplicationBase" ) );
416*b1cdbd2cSJim Jagielski 	}
417*b1cdbd2cSJim Jagielski 	return aServiceNames;
418*b1cdbd2cSJim Jagielski }
419*b1cdbd2cSJim Jagielski 
Undo()420*b1cdbd2cSJim Jagielski void SAL_CALL VbaApplicationBase::Undo()
421*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_QUERY_THROW );
424*b1cdbd2cSJim Jagielski 	dispatchRequests( xModel, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Undo" ) ) );
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski 
Quit()427*b1cdbd2cSJim Jagielski void VbaApplicationBase::Quit() throw (uno::RuntimeException)
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski     // need to stop basic
430*b1cdbd2cSJim Jagielski     SbMethod* pMeth = StarBASIC::GetActiveMethod();
431*b1cdbd2cSJim Jagielski     if ( pMeth )
432*b1cdbd2cSJim Jagielski     {
433*b1cdbd2cSJim Jagielski         SbModule* pMod = dynamic_cast< SbModule* >( pMeth->GetParent() );
434*b1cdbd2cSJim Jagielski         if ( pMod )
435*b1cdbd2cSJim Jagielski         {
436*b1cdbd2cSJim Jagielski             StarBASIC* pBasic = dynamic_cast< StarBASIC* >( pMod->GetParent() );
437*b1cdbd2cSJim Jagielski             if ( pBasic )
438*b1cdbd2cSJim Jagielski                 pBasic->QuitAndExitApplication();
439*b1cdbd2cSJim Jagielski         }
440*b1cdbd2cSJim Jagielski     }
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
443