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