xref: /AOO41X/main/vbahelper/source/vbahelper/vbahelper.cxx (revision e6ed5fbc51cf474df369618b58e945b84a21a167)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include <cppuhelper/bootstrap.hxx>
24 #include <com/sun/star/util/XURLTransformer.hpp>
25 #include <com/sun/star/frame/XDispatchProvider.hpp>
26 #include <com/sun/star/frame/XModel.hpp>
27 #include <com/sun/star/frame/XFrame.hpp>
28 #include <com/sun/star/frame/XDesktop.hpp>
29 #include <com/sun/star/frame/XController.hpp>
30 #include <com/sun/star/frame/XModel2.hpp>
31 #include <com/sun/star/script/XDefaultProperty.hpp>
32 #include <com/sun/star/uno/XComponentContext.hpp>
33 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
34 #include <com/sun/star/lang/XUnoTunnel.hpp>
35 #include <com/sun/star/beans/XPropertySet.hpp>
36 #include <com/sun/star/beans/XIntrospection.hpp>
37 #include <com/sun/star/util/MeasureUnit.hpp>
38 #include <com/sun/star/awt/XWindow.hpp>
39 #include <com/sun/star/awt/XDialog.hpp>
40 #include <com/sun/star/awt/PosSize.hpp>
41 
42 #include <ooo/vba/msforms/XShape.hpp>
43 
44 #include <comphelper/processfactory.hxx>
45 
46 #include <sfx2/objsh.hxx>
47 #include <sfx2/viewfrm.hxx>
48 #include <sfx2/dispatch.hxx>
49 #include <sfx2/app.hxx>
50 #include <svl/stritem.hxx>
51 #include <svl/eitem.hxx>
52 #include <svl/intitem.hxx>
53 #include <svl/itemset.hxx>
54 #include <sfx2/docfac.hxx>
55 #include <sfx2/viewfac.hxx>
56 
57 #include <basic/sbx.hxx>
58 #include <basic/sbstar.hxx>
59 #include <basic/basmgr.hxx>
60 #include <basic/sbmod.hxx>
61 #include <basic/sbmeth.hxx>
62 #include <rtl/math.hxx>
63 #include <sfx2/viewsh.hxx>
64 #include <math.h>
65 #include <tools/urlobj.hxx>
66 #include <osl/file.hxx>
67 #include <toolkit/awt/vclxwindow.hxx>
68 #include <toolkit/helper/vclunohelper.hxx>
69 #include <vcl/window.hxx>
70 #include <vcl/syswin.hxx>
71 #include <tools/diagnose_ex.h>
72 
73 #ifndef OOVBA_DLLIMPLEMENTATION
74 #define OOVBA_DLLIMPLEMENTATION
75 #endif
76 
77 #include <vbahelper/vbahelper.hxx>
78 #include <sfx2/app.hxx>
79 // #FIXME needs service
80 //#include "vbashape.hxx"
81 //#include "unonames.hxx"
82 
83 using namespace ::com::sun::star;
84 using namespace ::ooo::vba;
85 
86 void unoToSbxValue( SbxVariable* pVar, const uno::Any& aValue );
87 
88 uno::Any sbxToUnoValue( SbxVariable* pVar );
89 
90 
91 namespace ooo
92 {
93 namespace vba
94 {
95 
96 namespace { const double factor =  2540.0 / 72.0; }
97 
createVBAUnoAPIService(SfxObjectShell * pShell,const sal_Char * _pAsciiName)98 css::uno::Reference< css::uno::XInterface > createVBAUnoAPIService( SfxObjectShell* pShell, const sal_Char* _pAsciiName ) throw (css::uno::RuntimeException)
99 {
100     OSL_PRECOND( pShell, "createVBAUnoAPIService: no shell!" );
101     ::rtl::OUString sVarName( ::rtl::OUString::createFromAscii( _pAsciiName ) );
102     return getVBAServiceFactory( pShell )->createInstance( sVarName );
103 }
104 
105 // helper method to determine if the view ( calc ) is in print-preview mode
isInPrintPreview(SfxViewFrame * pView)106 bool isInPrintPreview( SfxViewFrame* pView )
107 {
108     sal_uInt16 nViewNo = SID_VIEWSHELL1 - SID_VIEWSHELL0;
109     if ( pView->GetObjectShell()->GetFactory().GetViewFactoryCount() >
110 nViewNo && !pView->GetObjectShell()->IsInPlaceActive() )
111     {
112         SfxViewFactory &rViewFactory =
113             pView->GetObjectShell()->GetFactory().GetViewFactory(nViewNo);
114         if (  pView->GetCurViewId() == rViewFactory.GetOrdinal() )
115             return true;
116     }
117     return false;
118 }
119 #if 0
120 namespace excel // all in this namespace probably can be moved to sc
121 {
122 
123 
124 const ::rtl::OUString REPLACE_CELLS_WARNING(  RTL_CONSTASCII_USTRINGPARAM( "ReplaceCellsWarning"));
125 class PasteCellsWarningReseter
126 {
127 private:
128     bool bInitialWarningState;
129     static uno::Reference< beans::XPropertySet > getGlobalSheetSettings() throw ( uno::RuntimeException )
130     {
131         static uno::Reference< beans::XPropertySet > xTmpProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
132         static uno::Reference<uno::XComponentContext > xContext( xTmpProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW );
133         static uno::Reference<lang::XMultiComponentFactory > xServiceManager(
134                 xContext->getServiceManager(), uno::UNO_QUERY_THROW );
135         static uno::Reference< beans::XPropertySet > xProps( xServiceManager->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.GlobalSheetSettings" ) ) ,xContext ), uno::UNO_QUERY_THROW );
136         return xProps;
137     }
138 
139     bool getReplaceCellsWarning() throw ( uno::RuntimeException )
140     {
141         sal_Bool res = sal_False;
142         getGlobalSheetSettings()->getPropertyValue( REPLACE_CELLS_WARNING ) >>= res;
143         return ( res == sal_True );
144     }
145 
146     void setReplaceCellsWarning( bool bState ) throw ( uno::RuntimeException )
147     {
148         getGlobalSheetSettings()->setPropertyValue( REPLACE_CELLS_WARNING, uno::makeAny( bState ) );
149     }
150 public:
151     PasteCellsWarningReseter() throw ( uno::RuntimeException )
152     {
153         bInitialWarningState = getReplaceCellsWarning();
154         if ( bInitialWarningState )
155             setReplaceCellsWarning( false );
156     }
157     ~PasteCellsWarningReseter()
158     {
159         if ( bInitialWarningState )
160         {
161             // don't allow dtor to throw
162             try
163             {
164                 setReplaceCellsWarning( true );
165             }
166             catch ( uno::Exception& /*e*/ ){}
167         }
168     }
169 };
170 
171 void
172 implnPaste()
173 {
174     PasteCellsWarningReseter resetWarningBox;
175     ScTabViewShell* pViewShell = getCurrentBestViewShell();
176     if ( pViewShell )
177     {
178         pViewShell->PasteFromSystem();
179         pViewShell->CellContentChanged();
180     }
181 }
182 
183 
184 void
185 implnCopy()
186 {
187     ScTabViewShell* pViewShell = getCurrentBestViewShell();
188     if ( pViewShell )
189         pViewShell->CopyToClip(NULL,false,false,true);
190 }
191 
192 void
193 implnCut()
194 {
195     ScTabViewShell* pViewShell =  getCurrentBestViewShell();
196     if ( pViewShell )
197         pViewShell->CutToClip( NULL, sal_True );
198 }
199 void implnPasteSpecial(SfxViewShell* pViewShell, sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty, sal_Bool bTranspose)
200 {
201     PasteCellsWarningReseter resetWarningBox;
202     sal_Bool bAsLink(sal_False), bOtherDoc(sal_False);
203     InsCellCmd eMoveMode = INS_NONE;
204 
205     if ( !pTabViewShell )
206         // none active, try next best
207         pTabViewShell = getCurrentBestViewShell();
208     if ( pTabViewShell )
209     {
210         ScViewData* pView = pTabViewShell->GetViewData();
211         Window* pWin = ( pView != NULL ) ? pView->GetActiveWin() : NULL;
212         if ( pView && pWin )
213         {
214             if ( bAsLink && bOtherDoc )
215                 pTabViewShell->PasteFromSystem(0);//SOT_FORMATSTR_ID_LINK
216             else
217             {
218                 ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin );
219                 ScDocument* pDoc = NULL;
220                 if ( pOwnClip )
221                     pDoc = pOwnClip->GetDocument();
222                 pTabViewShell->PasteFromClip( nFlags, pDoc,
223                     nFunction, bSkipEmpty, bTranspose, bAsLink,
224                     eMoveMode, IDF_NONE, sal_True );
225                 pTabViewShell->CellContentChanged();
226             }
227         }
228     }
229 
230 }
231 
232 ScDocShell*
233 getDocShell( css::uno::Reference< css::frame::XModel>& xModel )
234 {
235     uno::Reference< uno::XInterface > xIf( xModel, uno::UNO_QUERY_THROW );
236     ScModelObj* pModel = dynamic_cast< ScModelObj* >( xIf.get() );
237     ScDocShell* pDocShell = NULL;
238     if ( pModel )
239         pDocShell = (ScDocShell*)pModel->GetEmbeddedObject();
240     return pDocShell;
241 
242 }
243 
244 ScTabViewShell*
245 getBestViewShell(  css::uno::Reference< css::frame::XModel>& xModel )
246 {
247     ScDocShell* pDocShell = getDocShell( xModel );
248     if ( pDocShell )
249         return pDocShell->GetBestViewShell();
250     return NULL;
251 }
252 
253 ScTabViewShell*
254 getCurrentBestViewShell()
255 {
256     uno::Reference< frame::XModel > xModel = getCurrentDocument();
257     return getBestViewShell( xModel );
258 }
259 
260 SfxViewFrame*
261 getCurrentViewFrame()
262 {
263     ScTabViewShell* pViewShell = getCurrentBestViewShell();
264     if ( pViewShell )
265         return pViewShell->GetViewFrame();
266     return NULL;
267 }
268 };
269 
270 #endif
271 
272 uno::Reference< beans::XIntrospectionAccess >
getIntrospectionAccess(const uno::Any & aObject)273 getIntrospectionAccess( const uno::Any& aObject ) throw (uno::RuntimeException)
274 {
275     static uno::Reference< beans::XIntrospection > xIntrospection;
276     if( !xIntrospection.is() )
277     {
278         uno::Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
279         xIntrospection.set( xFactory->createInstance( rtl::OUString::createFromAscii("com.sun.star.beans.Introspection") ), uno::UNO_QUERY_THROW );
280     }
281     return xIntrospection->inspect( aObject );
282 }
283 
284 uno::Reference< script::XTypeConverter >
getTypeConverter(const uno::Reference<uno::XComponentContext> & xContext)285 getTypeConverter( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
286 {
287     static uno::Reference< script::XTypeConverter > xTypeConv( xContext->getServiceManager()->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter") ), xContext ), uno::UNO_QUERY_THROW );
288     return xTypeConv;
289 }
290 const uno::Any&
aNULL()291 aNULL()
292 {
293     static  uno::Any aNULLL = uno::makeAny( uno::Reference< uno::XInterface >() );
294     return aNULLL;
295 }
296 
dispatchExecute(SfxViewShell * pViewShell,sal_uInt16 nSlot,SfxCallMode nCall)297 void dispatchExecute(SfxViewShell* pViewShell, sal_uInt16 nSlot, SfxCallMode nCall)
298 {
299     SfxViewFrame* pViewFrame = NULL;
300     if ( pViewShell )
301         pViewFrame = pViewShell->GetViewFrame();
302     if ( pViewFrame )
303     {
304         SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
305         if( pDispatcher )
306         {
307             pDispatcher->Execute( nSlot , nCall );
308         }
309     }
310 }
311 
312 void
dispatchRequests(const uno::Reference<frame::XModel> & xModel,const rtl::OUString & aUrl,const uno::Sequence<beans::PropertyValue> & sProps)313 dispatchRequests( const uno::Reference< frame::XModel>& xModel, const rtl::OUString& aUrl, const uno::Sequence< beans::PropertyValue >& sProps )
314 {
315     util::URL url;
316     url.Complete = aUrl;
317     rtl::OUString emptyString = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "" ));
318     uno::Reference<frame::XController> xController = xModel->getCurrentController();
319     uno::Reference<frame::XFrame> xFrame = xController->getFrame();
320     uno::Reference<frame::XDispatchProvider> xDispatchProvider (xFrame,uno::UNO_QUERY_THROW);
321     try
322     {
323         uno::Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
324         uno::Reference<uno::XComponentContext > xContext( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW  );
325         if ( !xContext.is() )
326             return;
327 
328         uno::Reference<lang::XMultiComponentFactory > xServiceManager = xContext->getServiceManager();
329         if ( !xServiceManager.is() )
330             return;
331 
332         uno::Reference<util::XURLTransformer> xParser( xServiceManager->createInstanceWithContext(
333             rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ) ), xContext),
334             uno::UNO_QUERY_THROW );
335         if (!xParser.is())
336             return;
337         xParser->parseStrict (url);
338     }
339     catch ( uno::Exception & /*e*/ )
340     {
341         return;
342     }
343 
344     uno::Reference<frame::XDispatch> xDispatcher = xDispatchProvider->queryDispatch(url,emptyString,0);
345 
346     uno::Sequence<beans::PropertyValue> dispatchProps(1);
347 
348     sal_Int32 nProps = sProps.getLength();
349     beans::PropertyValue* pDest = dispatchProps.getArray();
350     if ( nProps )
351     {
352         dispatchProps.realloc( nProps + 1 );
353         // need to reaccquire pDest after realloc
354         pDest = dispatchProps.getArray();
355         const beans::PropertyValue* pSrc = sProps.getConstArray();
356         for ( sal_Int32 index=0; index<nProps; ++index, ++pSrc, ++pDest )
357             *pDest = *pSrc;
358     }
359 
360     (*pDest).Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Silent" ));
361     (*pDest).Value <<= (sal_Bool)sal_True;
362 
363     if (xDispatcher.is())
364         xDispatcher->dispatch( url, dispatchProps );
365 }
366 
367 void
dispatchRequests(const uno::Reference<frame::XModel> & xModel,const rtl::OUString & aUrl)368 dispatchRequests( const uno::Reference< frame::XModel>& xModel, const rtl::OUString& aUrl )
369 {
370     uno::Sequence<beans::PropertyValue> dispatchProps;
371     dispatchRequests( xModel, aUrl, dispatchProps );
372 }
373 
374 uno::Reference< frame::XModel >
getCurrentDoc(const rtl::OUString & sKey)375 getCurrentDoc( const rtl::OUString& sKey ) throw (uno::RuntimeException)
376 {
377     uno::Reference< frame::XModel > xModel;
378     SbxObject* pBasic = dynamic_cast< SbxObject* > ( SFX_APP()->GetBasic() );
379     SbxObject* basicChosen =  pBasic ;
380     if ( basicChosen == NULL)
381     {
382         OSL_TRACE("getModelFromBasic() StarBASIC* is NULL" );
383         return xModel;
384     }
385     SbxObject* p = pBasic;
386     SbxObject* pParent = p->GetParent();
387     SbxObject* pParentParent = pParent ? pParent->GetParent() : NULL;
388 
389     if( pParentParent )
390     {
391         basicChosen = pParentParent;
392     }
393     else if( pParent )
394     {
395         basicChosen = pParent;
396     }
397 
398 
399     uno::Any aModel;
400     SbxVariable *pCompVar = basicChosen->Find(  sKey, SbxCLASS_OBJECT );
401 
402     if ( pCompVar )
403     {
404         aModel = sbxToUnoValue( pCompVar );
405         if ( sal_False == ( aModel >>= xModel ) ||
406             !xModel.is() )
407         {
408             throw uno::RuntimeException(
409                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can't extract model from basic ( its obviously not set yet ) therefore don't know the current documet context") ), uno::Reference< uno::XInterface >() );
410         }
411         else
412         {
413             OSL_TRACE("Have model points to url %s",
414             ::rtl::OUStringToOString( xModel->getURL(),
415                 RTL_TEXTENCODING_ASCII_US ).pData->buffer );
416         }
417     }
418     else
419     {
420         OSL_TRACE("Failed to get %s", rtl::OUStringToOString( sKey, RTL_TEXTENCODING_UTF8 ).getStr() );
421         throw uno::RuntimeException(
422             rtl::OUString(
423                 RTL_CONSTASCII_USTRINGPARAM(
424                     "Can't determine the currently selected document") ),
425             uno::Reference< uno::XInterface >() );
426     }
427     return xModel;
428 }
429 
430  uno::Reference< frame::XModel >
getCurrentDocCtx(const rtl::OUString & ctxName,const uno::Reference<uno::XComponentContext> & xContext)431 getCurrentDocCtx( const rtl::OUString& ctxName, const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
432 {
433     uno::Reference< frame::XModel > xModel;
434      // try fallback to calling doc
435      css::uno::Reference< css::container::XNameAccess > xNameAccess( xContext, css::uno::UNO_QUERY_THROW );
436      xModel.set( xNameAccess->getByName( ctxName ), uno::UNO_QUERY_THROW );
437      return xModel;
438 }
439 
440 uno::Reference< frame::XModel >
getThisExcelDoc(const uno::Reference<uno::XComponentContext> & xContext)441 getThisExcelDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
442 {
443     return getCurrentDocCtx( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ExcelDocumentContext" ) ), xContext );
444 }
445 
446 uno::Reference< frame::XModel >
getThisWordDoc(const uno::Reference<uno::XComponentContext> & xContext)447 getThisWordDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
448 {
449     return getCurrentDocCtx( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WordDocumentContext" ) ), xContext );
450 }
451 
452  uno::Reference< frame::XModel >
getCurrentExcelDoc(const uno::Reference<uno::XComponentContext> & xContext)453 getCurrentExcelDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
454 {
455     static const rtl::OUString sThisExcelDoc( RTL_CONSTASCII_USTRINGPARAM("ThisExcelDoc" ) );
456     uno::Reference< frame::XModel > xModel;
457     try
458     {
459         xModel = getCurrentDoc( sThisExcelDoc );
460     }
461     catch( uno::Exception& e )
462     {
463         xModel = getThisExcelDoc( xContext );
464     }
465     return xModel;
466 }
467 
468  uno::Reference< frame::XModel >
getCurrentWordDoc(const uno::Reference<uno::XComponentContext> & xContext)469 getCurrentWordDoc( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
470 {
471     static const rtl::OUString sThisWordDoc( RTL_CONSTASCII_USTRINGPARAM("ThisWordDoc" ) );
472     uno::Reference< frame::XModel > xModel;
473     try
474     {
475         xModel = getCurrentDoc( sThisWordDoc );
476     }
477     catch( uno::Exception& e )
478     {
479         xModel = getThisWordDoc( xContext );
480     }
481     return xModel;
482 }
483 
484 sal_Int32
OORGBToXLRGB(sal_Int32 nCol)485 OORGBToXLRGB( sal_Int32 nCol )
486 {
487         sal_Int32 nAutoBits = nCol;
488         nAutoBits &= 0xFF000000;
489     sal_Int32 nRed = nCol;
490     nRed &= 0x00FF0000;
491     nRed >>= 16;
492     sal_Int32 nGreen = nCol;
493     nGreen &= 0x0000FF00;
494     nGreen >>= 8;
495     sal_Int32 nBlue = nCol;
496     nBlue &= 0x000000FF;
497     sal_Int32 nRGB =  ( nAutoBits | (nBlue << 16) | (nGreen << 8) | nRed );
498     return nRGB;
499 }
500 sal_Int32
XLRGBToOORGB(sal_Int32 nCol)501 XLRGBToOORGB( sal_Int32 nCol )
502 {
503         sal_Int32 nAutoBits = nCol;
504         nAutoBits &= 0xFF000000;
505 
506     sal_Int32 nBlue = nCol;
507     nBlue &= 0x00FF0000;
508     nBlue >>= 16;
509     sal_Int32 nGreen = nCol;
510     nGreen &= 0x0000FF00;
511     nGreen >>= 8;
512     sal_Int32 nRed = nCol;
513     nRed &= 0x000000FF;
514     sal_Int32 nRGB =  ( nAutoBits | (nRed << 16) | (nGreen << 8) | nBlue );
515     return nRGB;
516 }
517 uno::Any
OORGBToXLRGB(const uno::Any & aCol)518 OORGBToXLRGB( const uno::Any& aCol )
519 {
520     sal_Int32 nCol(0);
521     aCol >>= nCol;
522     nCol = OORGBToXLRGB( nCol );
523     return uno::makeAny( nCol );
524 }
525 uno::Any
XLRGBToOORGB(const uno::Any & aCol)526 XLRGBToOORGB(  const uno::Any& aCol )
527 {
528     sal_Int32 nCol(0);
529     aCol >>= nCol;
530     nCol = XLRGBToOORGB( nCol );
531     return uno::makeAny( nCol );
532 }
533 
PrintOutHelper(SfxViewShell * pViewShell,const uno::Any & From,const uno::Any & To,const uno::Any & Copies,const uno::Any & Preview,const uno::Any &,const uno::Any &,const uno::Any & Collate,const uno::Any & PrToFileName,sal_Bool bUseSelection)534 void PrintOutHelper( SfxViewShell* pViewShell, const uno::Any& From, const uno::Any& To, const uno::Any& Copies, const uno::Any& Preview, const uno::Any& /*ActivePrinter*/, const uno::Any& /*PrintToFile*/, const uno::Any& Collate, const uno::Any& PrToFileName, sal_Bool bUseSelection  )
535 {
536     sal_Int32 nTo = 0;
537     sal_Int32 nFrom = 0;
538     sal_Int16 nCopies = 1;
539     sal_Bool bPreview = sal_False;
540     sal_Bool bCollate = sal_False;
541     sal_Bool bSelection = bUseSelection;
542     From >>= nFrom;
543     To >>= nTo;
544     Copies >>= nCopies;
545     Preview >>= bPreview;
546     if ( nCopies > 1 ) // Collate only useful when more that 1 copy
547         Collate >>= bCollate;
548 
549     rtl::OUString sRange(  RTL_CONSTASCII_USTRINGPARAM( "-" ) );
550     rtl::OUString sFileName;
551 
552     if (( nFrom || nTo ) )
553     {
554         if ( nFrom )
555             sRange = ( ::rtl::OUString::valueOf( nFrom ) + sRange );
556         if ( nTo )
557             sRange += ::rtl::OUString::valueOf( nTo );
558     }
559 
560     if (  PrToFileName.getValue() )
561     {
562         PrToFileName >>= sFileName;
563     }
564     SfxViewFrame* pViewFrame = NULL;
565     if ( pViewShell )
566         pViewFrame = pViewShell->GetViewFrame();
567     if ( pViewFrame )
568     {
569         SfxAllItemSet aArgs( SFX_APP()->GetPool() );
570 
571         SfxBoolItem sfxCollate( SID_PRINT_COLLATE, bCollate );
572         aArgs.Put( sfxCollate, sfxCollate.Which() );
573         SfxInt16Item sfxCopies( SID_PRINT_COPIES, nCopies );
574         aArgs.Put( sfxCopies, sfxCopies.Which() );
575         if ( sFileName.getLength() )
576         {
577             SfxStringItem sfxFileName( SID_FILE_NAME, sFileName);
578             aArgs.Put( sfxFileName, sfxFileName.Which() );
579 
580         }
581         if (  sRange.getLength() )
582         {
583             SfxStringItem sfxRange( SID_PRINT_PAGES, sRange );
584             aArgs.Put( sfxRange, sfxRange.Which() );
585         }
586         SfxBoolItem sfxSelection( SID_SELECTION, bSelection );
587         aArgs.Put( sfxSelection, sfxSelection.Which() );
588         SfxBoolItem sfxAsync( SID_ASYNCHRON, sal_False );
589         aArgs.Put( sfxAsync, sfxAsync.Which() );
590         SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
591 
592         if ( pDispatcher )
593         {
594             if ( bPreview )
595             {
596                 if ( !pViewFrame->GetFrame().IsInPlace() )
597                 {
598                     // #TODO is this necessary ( calc specific )
599 //                  SC_MOD()->InputEnterHandler();
600                     pViewFrame->GetDispatcher()->Execute( SID_VIEWSHELL1, SFX_CALLMODE_SYNCHRON );
601                     while ( isInPrintPreview( pViewFrame ) )
602                         Application::Yield();
603                 }
604             }
605             else
606                 pDispatcher->Execute( (sal_uInt16)SID_PRINTDOC, (SfxCallMode)SFX_CALLMODE_SYNCHRON, aArgs );
607         }
608 
609     }
610 
611     // #FIXME #TODO
612     // 1 ActivePrinter ( how/can we switch a printer via API? )
613     // 2 PrintToFile ( ms behaviour if this option is specified but no
614     //   filename supplied 'PrToFileName' then the user will be prompted )
615     // 3 Need to check behaviour of Selected sheets with range ( e.g. From & To
616     //    values ) in oOO these options are mutually exclusive
617     // 4 There is a pop up to do with transparent objects in the print source
618     //   should be able to disable that via configuration for the duration
619     //   of this method
620 }
621 
PrintPreviewHelper(const css::uno::Any &,SfxViewShell * pViewShell)622  void PrintPreviewHelper( const css::uno::Any& /*EnableChanges*/, SfxViewShell* pViewShell )
623 {
624     dispatchExecute( pViewShell, SID_VIEWSHELL1 );
625 }
626 
extractIntFromAny(const uno::Any & rAny)627 sal_Int32 extractIntFromAny( const uno::Any& rAny ) throw (uno::RuntimeException)
628 {
629     switch( rAny.getValueType().getTypeClass() )
630     {
631         case uno::TypeClass_FLOAT:
632             return static_cast< sal_Int32 >( rAny.get< float >() );
633         case uno::TypeClass_DOUBLE:
634             return static_cast< sal_Int32 >( rAny.get< double >() );
635         case uno::TypeClass_BYTE:
636         case uno::TypeClass_SHORT:
637         case uno::TypeClass_LONG:
638             return rAny.get< sal_Int32 >();
639         default:;
640     }
641     throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid type, cannot convert to integer." ) ), 0 );
642 }
643 
extractIntFromAny(const uno::Any & rAny,sal_Int32 nDefault)644 sal_Int32 extractIntFromAny( const uno::Any& rAny, sal_Int32 nDefault ) throw (uno::RuntimeException)
645 {
646     return rAny.hasValue() ? extractIntFromAny( rAny ) : nDefault;
647 }
648 
extractBoolFromAny(const uno::Any & rAny)649 bool extractBoolFromAny( const uno::Any& rAny ) throw (uno::RuntimeException)
650 {
651     switch( rAny.getValueType().getTypeClass() )
652     {
653         case uno::TypeClass_BOOLEAN:
654             return rAny.get< bool >();
655         case uno::TypeClass_FLOAT:
656             return rAny.get< float >() != 0.0;
657         case uno::TypeClass_DOUBLE:
658             return rAny.get< double >() != 0.0;
659         case uno::TypeClass_BYTE:
660         case uno::TypeClass_SHORT:
661         case uno::TypeClass_LONG:
662             return rAny.get< sal_Int32 >() != 0;
663         case uno::TypeClass_HYPER:
664             return rAny.get< sal_Int64 >() != 0;
665         default:;
666     }
667     throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid type, cannot convert to boolean." ) ), 0 );
668 }
669 
extractBoolFromAny(const uno::Any & rAny,bool bDefault)670 bool extractBoolFromAny( const uno::Any& rAny, bool bDefault ) throw (uno::RuntimeException)
671 {
672     return rAny.hasValue() ? extractBoolFromAny( rAny ) : bDefault;
673 }
674 
extractStringFromAny(const uno::Any & rAny,bool bUppercaseBool)675 ::rtl::OUString extractStringFromAny( const uno::Any& rAny, bool bUppercaseBool ) throw (uno::RuntimeException)
676 {
677     switch( rAny.getValueType().getTypeClass() )
678     {
679         case uno::TypeClass_STRING:
680             return rAny.get< ::rtl::OUString >();
681         case uno::TypeClass_BOOLEAN:
682             return bUppercaseBool ?
683                 (rAny.get< bool >() ? ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TRUE" ) ) : ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FALSE" ) )) :
684                 ::rtl::OUString::valueOf( (sal_Bool)rAny.get< bool >() );
685         case uno::TypeClass_FLOAT:
686             return ::rtl::OUString::valueOf( rAny.get< float >() );
687         case uno::TypeClass_DOUBLE:
688             return ::rtl::OUString::valueOf( rAny.get< double >() );
689         case uno::TypeClass_BYTE:
690         case uno::TypeClass_SHORT:
691         case uno::TypeClass_LONG:
692             return ::rtl::OUString::valueOf( rAny.get< sal_Int32 >() );
693         case uno::TypeClass_HYPER:
694             return ::rtl::OUString::valueOf( rAny.get< sal_Int64 >() );
695         default:;
696     }
697     throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Invalid type, cannot convert to string." ) ), 0 );
698 }
699 
extractStringFromAny(const uno::Any & rAny,const::rtl::OUString & rDefault,bool bUppercaseBool)700 ::rtl::OUString extractStringFromAny( const uno::Any& rAny, const ::rtl::OUString& rDefault, bool bUppercaseBool ) throw (uno::RuntimeException)
701 {
702     return rAny.hasValue() ? extractStringFromAny( rAny, bUppercaseBool ) : rDefault;
703 }
704 
getAnyAsString(const uno::Any & pvargItem)705 rtl::OUString getAnyAsString( const uno::Any& pvargItem ) throw ( uno::RuntimeException )
706 {
707     return extractStringFromAny( pvargItem );
708 }
709 
710 
711 rtl::OUString
getUniqueName(const uno::Sequence<::rtl::OUString> & _slist,const rtl::OUString & _sElementName,const::rtl::OUString & _sSuffixSeparator)712 ContainerUtilities::getUniqueName( const uno::Sequence< ::rtl::OUString >&  _slist, const rtl::OUString& _sElementName, const ::rtl::OUString& _sSuffixSeparator)
713 {
714     return getUniqueName(_slist, _sElementName, _sSuffixSeparator, sal_Int32(2));
715 }
716 
717 rtl::OUString
getUniqueName(const uno::Sequence<rtl::OUString> & _slist,const rtl::OUString _sElementName,const rtl::OUString & _sSuffixSeparator,sal_Int32 _nStartSuffix)718 ContainerUtilities::getUniqueName( const uno::Sequence< rtl::OUString >& _slist, const rtl::OUString _sElementName, const rtl::OUString& _sSuffixSeparator, sal_Int32 _nStartSuffix)
719 {
720     sal_Int32 a = _nStartSuffix;
721     rtl::OUString scompname = _sElementName;
722     bool bElementexists = true;
723     sal_Int32 nLen = _slist.getLength();
724     if ( nLen == 0 )
725         return _sElementName;
726 
727     while (bElementexists == true)
728     {
729         for (sal_Int32 i = 0; i < nLen; i++)
730         {
731             if (FieldInList(_slist, scompname) == -1)
732             {
733                 return scompname;
734             }
735         }
736         scompname = _sElementName + _sSuffixSeparator + rtl::OUString::valueOf( a++ );
737     }
738     return rtl::OUString();
739 }
740 
741 sal_Int32
FieldInList(const uno::Sequence<rtl::OUString> & SearchList,const rtl::OUString & SearchString)742 ContainerUtilities::FieldInList( const uno::Sequence< rtl::OUString >& SearchList, const rtl::OUString& SearchString )
743 {
744     sal_Int32 FieldLen = SearchList.getLength();
745     sal_Int32 retvalue = -1;
746     for (sal_Int32 i = 0; i < FieldLen; i++)
747     {
748         // I wonder why comparing lexicographically is done
749         // when its a match is whats interesting?
750         //if (SearchList[i].compareTo(SearchString) == 0)
751         if ( SearchList[i].equals( SearchString ) )
752         {
753             retvalue = i;
754             break;
755         }
756     }
757     return retvalue;
758 
759 }
NeedEsc(sal_Unicode cCode)760 bool NeedEsc(sal_Unicode cCode)
761 {
762     String sEsc(RTL_CONSTASCII_USTRINGPARAM(".^$+\\|{}()"));
763     return (STRING_NOTFOUND != sEsc.Search(cCode));
764 }
765 
VBAToRegexp(const rtl::OUString & rIn,bool bForLike)766 rtl::OUString VBAToRegexp(const rtl::OUString &rIn, bool bForLike )
767 {
768     rtl::OUStringBuffer sResult;
769     const sal_Unicode *start = rIn.getStr();
770     const sal_Unicode *end = start + rIn.getLength();
771 
772     int seenright = 0;
773     if ( bForLike )
774         sResult.append(static_cast<sal_Unicode>('^'));
775 
776     while (start < end)
777     {
778         switch (*start)
779         {
780             case '?':
781                 sResult.append(static_cast<sal_Unicode>('.'));
782                 start++;
783                 break;
784             case '*':
785                 sResult.append(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".*")));
786                 start++;
787                 break;
788             case '#':
789                 sResult.append(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[0-9]")));
790                 start++;
791                 break;
792             case '~':
793                 sResult.append(static_cast<sal_Unicode>('\\'));
794                 sResult.append(*(++start));
795                 start++;
796                 break;
797                 // dump the ~ and escape the next characture
798             case ']':
799                 sResult.append(static_cast<sal_Unicode>('\\'));
800                 sResult.append(*start++);
801                 break;
802             case '[':
803                 sResult.append(*start++);
804                 seenright = 0;
805                 while (start < end && !seenright)
806                 {
807                     switch (*start)
808                     {
809                         case '[':
810                         case '?':
811                         case '*':
812                         sResult.append(static_cast<sal_Unicode>('\\'));
813                         sResult.append(*start);
814                             break;
815                         case ']':
816                         sResult.append(*start);
817                             seenright = 1;
818                             break;
819                         case '!':
820                             sResult.append(static_cast<sal_Unicode>('^'));
821                             break;
822                         default:
823                         if (NeedEsc(*start))
824                             sResult.append(static_cast<sal_Unicode>('\\'));
825                         sResult.append(*start);
826                             break;
827                     }
828                     start++;
829                 }
830                 break;
831             default:
832                 if (NeedEsc(*start))
833                     sResult.append(static_cast<sal_Unicode>('\\'));
834                 sResult.append(*start++);
835         }
836     }
837 
838     if ( bForLike )
839         sResult.append(static_cast<sal_Unicode>('$'));
840 
841     return sResult.makeStringAndClear( );
842 }
843 
getPixelTo100thMillimeterConversionFactor(const css::uno::Reference<css::awt::XDevice> & xDevice,sal_Bool bVertical)844 double getPixelTo100thMillimeterConversionFactor( const css::uno::Reference< css::awt::XDevice >& xDevice, sal_Bool bVertical)
845 {
846     double fConvertFactor = 1.0;
847     if( bVertical )
848     {
849         fConvertFactor = xDevice->getInfo().PixelPerMeterY/100000;
850     }
851     else
852     {
853         fConvertFactor = xDevice->getInfo().PixelPerMeterX/100000;
854     }
855     return fConvertFactor;
856 }
857 
PointsToPixels(const css::uno::Reference<css::awt::XDevice> & xDevice,double fPoints,sal_Bool bVertical)858 double PointsToPixels( const css::uno::Reference< css::awt::XDevice >& xDevice, double fPoints, sal_Bool bVertical)
859 {
860     double fConvertFactor = getPixelTo100thMillimeterConversionFactor( xDevice, bVertical );
861     return PointsToHmm( fPoints ) * fConvertFactor;
862 }
PixelsToPoints(const css::uno::Reference<css::awt::XDevice> & xDevice,double fPixels,sal_Bool bVertical)863 double PixelsToPoints( const css::uno::Reference< css::awt::XDevice >& xDevice, double fPixels, sal_Bool bVertical)
864 {
865     double fConvertFactor = getPixelTo100thMillimeterConversionFactor( xDevice, bVertical );
866     return HmmToPoints( fPixels/fConvertFactor );
867 }
868 
PointsToHmm(double fPoints)869 sal_Int32 PointsToHmm( double fPoints )
870 {
871     return static_cast<sal_Int32>( fPoints * factor + 0.5 );
872 }
873 
HmmToPoints(sal_Int32 nHmm)874 double HmmToPoints( sal_Int32 nHmm )
875 {
876     return nHmm / factor;
877 }
878 
ConcreteXShapeGeometryAttributes(const css::uno::Reference<css::uno::XComponentContext> &,const css::uno::Reference<css::drawing::XShape> & xShape)879 ConcreteXShapeGeometryAttributes::ConcreteXShapeGeometryAttributes( const css::uno::Reference< css::uno::XComponentContext >& /*xContext*/, const css::uno::Reference< css::drawing::XShape >& xShape )
880 {
881     m_pShapeHelper.reset( new ShapeHelper( xShape ) );
882 }
~ConcreteXShapeGeometryAttributes()883 ConcreteXShapeGeometryAttributes::~ConcreteXShapeGeometryAttributes()
884 {
885 }
886 
getPointerStyle(const uno::Reference<frame::XModel> & xModel)887 sal_Int32 getPointerStyle( const uno::Reference< frame::XModel >& xModel )
888 {
889 
890     sal_Int32 nPointerStyle( POINTER_ARROW );
891     try
892     {
893         const uno::Reference< frame::XController > xController( xModel->getCurrentController(),     uno::UNO_SET_THROW );
894         const uno::Reference< frame::XFrame >      xFrame     ( xController->getFrame(),        uno::UNO_SET_THROW );
895         const uno::Reference< awt::XWindow >       xWindow    ( xFrame->getContainerWindow(),   uno::UNO_SET_THROW );
896         // why the heck isn't there an XWindowPeer::getPointer, but a setPointer only?
897         const Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
898         if ( pWindow )
899             nPointerStyle = pWindow->GetSystemWindow()->GetPointer().GetStyle();
900     }
901     catch( const uno::Exception& )
902     {
903         DBG_UNHANDLED_EXCEPTION();
904     }
905     return nPointerStyle;
906 }
907 
908 // #FIXME this method looks wrong, shouldn't it just affect calc *or* writer
909 // document/frame/window(s) but not both ( and depending on what api called
910 // this )
setCursorHelper(const uno::Reference<frame::XModel> & xModel,const Pointer & rPointer,sal_Bool bOverWrite)911 void setCursorHelper( const uno::Reference< frame::XModel >& xModel, const Pointer& rPointer, sal_Bool bOverWrite )
912 {
913     ::std::vector< uno::Reference< frame::XController > > aControllers;
914 
915     uno::Reference< frame::XModel2 > xModel2( xModel, uno::UNO_QUERY );
916     if ( xModel2.is() )
917     {
918         const uno::Reference< container::XEnumeration > xEnumControllers( xModel2->getControllers(), uno::UNO_SET_THROW );
919         while ( xEnumControllers->hasMoreElements() )
920         {
921             const uno::Reference< frame::XController > xController( xEnumControllers->nextElement(), uno::UNO_QUERY_THROW );
922             aControllers.push_back( xController );
923         }
924     }
925     else
926     {
927         if ( xModel.is() )
928         {
929             const uno::Reference< frame::XController > xController( xModel->getCurrentController(), uno::UNO_SET_THROW );
930             aControllers.push_back( xController );
931         }
932     }
933 
934     for (   ::std::vector< uno::Reference< frame::XController > >::const_iterator controller = aControllers.begin();
935             controller != aControllers.end();
936             ++controller
937         )
938     {
939         const uno::Reference< frame::XFrame >      xFrame     ( (*controller)->getFrame(),       uno::UNO_SET_THROW   );
940         const uno::Reference< awt::XWindow >       xWindow    ( xFrame->getContainerWindow(),    uno::UNO_SET_THROW   );
941 
942         Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
943         OSL_ENSURE( pWindow, "ScVbaApplication::setCursor: no window!" );
944         if ( !pWindow )
945             continue;
946 
947         pWindow->GetSystemWindow()->SetPointer( rPointer );
948         pWindow->GetSystemWindow()->EnableChildPointerOverwrite( bOverWrite );
949     }
950 }
951 
setDefaultPropByIntrospection(const uno::Any & aObj,const uno::Any & aValue)952 void setDefaultPropByIntrospection( const uno::Any& aObj, const uno::Any& aValue  ) throw ( uno::RuntimeException )
953 {
954     uno::Reference< beans::XIntrospectionAccess > xUnoAccess( getIntrospectionAccess( aObj ) );
955 
956     // #MAYBE #FIXME sort of a bit of a hack,
957     uno::Reference<  script::XDefaultProperty > xDflt( aObj, uno::UNO_QUERY_THROW );
958     uno::Reference< beans::XPropertySet > xPropSet;
959 
960     if ( xUnoAccess.is() )
961         xPropSet.set( xUnoAccess->queryAdapter( ::getCppuType( (const uno::Reference< beans::XPropertySet > *)0 ) ), uno::UNO_QUERY);
962 
963     if ( xPropSet.is() )
964         xPropSet->setPropertyValue( xDflt->getDefaultPropertyName(), aValue );
965     else
966         throw uno::RuntimeException();
967 }
968 
getPropertyValue(const uno::Sequence<beans::PropertyValue> & aProp,const rtl::OUString & aName)969 uno::Any getPropertyValue( const uno::Sequence< beans::PropertyValue >& aProp, const rtl::OUString& aName )
970 {
971     uno::Any result;
972     for ( sal_Int32 i = 0; i < aProp.getLength(); i++ )
973     {
974         if ( aProp[i].Name.equals(aName) )
975         {
976             aProp[i].Value >>= result;
977             return result;
978         }
979     }
980     return result;
981 }
982 
setPropertyValue(uno::Sequence<beans::PropertyValue> & aProp,const rtl::OUString & aName,const uno::Any & aValue)983 sal_Bool setPropertyValue( uno::Sequence< beans::PropertyValue >& aProp, const rtl::OUString& aName, const uno::Any& aValue )
984 {
985     for ( sal_Int32 i = 0; i < aProp.getLength(); i++ )
986     {
987         if ( aProp[i].Name.equals(aName) )
988         {
989             aProp[i].Value = aValue;
990             return sal_True;
991         }
992     }
993     return sal_False;
994 }
995 
996 // ====UserFormGeomentryHelper====
997 //---------------------------------------------
UserFormGeometryHelper(const uno::Reference<uno::XComponentContext> &,const uno::Reference<awt::XControl> & xControl,double fOffsetX,double fOffsetY)998 UserFormGeometryHelper::UserFormGeometryHelper(
999         const uno::Reference< uno::XComponentContext >& /*xContext*/,
1000         const uno::Reference< awt::XControl >& xControl,
1001         double fOffsetX, double fOffsetY ) :
1002     mfOffsetX( fOffsetX ),
1003     mfOffsetY( fOffsetY ),
1004     mbDialog( uno::Reference< awt::XDialog >( xControl, uno::UNO_QUERY ).is() )
1005 {
1006     if ( !xControl.is() )
1007         throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No control is provided!" ) ),
1008                                      uno::Reference< uno::XInterface >() );
1009 
1010     mxWindow.set( xControl->getPeer(), uno::UNO_QUERY_THROW );
1011     mxModelProps.set( xControl->getModel(), uno::UNO_QUERY_THROW );
1012     mxUnitConv.set( mxWindow, uno::UNO_QUERY_THROW );
1013 }
1014 
getLeft() const1015 double UserFormGeometryHelper::getLeft() const
1016 {
1017     return implGetPos( false );
1018 }
1019 
setLeft(double fLeft)1020 void UserFormGeometryHelper::setLeft( double fLeft )
1021 {
1022     implSetPos( fLeft, false );
1023 }
1024 
getTop() const1025 double UserFormGeometryHelper::getTop() const
1026 {
1027     return implGetPos( true );
1028 }
1029 
setTop(double fTop)1030 void UserFormGeometryHelper::setTop( double fTop )
1031 {
1032     implSetPos( fTop, true );
1033 }
1034 
getWidth() const1035 double UserFormGeometryHelper::getWidth() const
1036 {
1037     return implGetSize( false, true );
1038 }
1039 
setWidth(double fWidth)1040 void UserFormGeometryHelper::setWidth( double fWidth )
1041 {
1042     implSetSize( fWidth, false, true );
1043 }
1044 
getHeight() const1045 double UserFormGeometryHelper::getHeight() const
1046 {
1047     return implGetSize( true, true );
1048 }
1049 
setHeight(double fHeight)1050 void UserFormGeometryHelper::setHeight( double fHeight )
1051 {
1052     implSetSize( fHeight, true, true );
1053 }
1054 
getInnerWidth() const1055 double UserFormGeometryHelper::getInnerWidth() const
1056 {
1057     return implGetSize( false, false );
1058 }
1059 
setInnerWidth(double fWidth)1060 void UserFormGeometryHelper::setInnerWidth( double fWidth )
1061 {
1062     implSetSize( fWidth, false, false );
1063 }
1064 
getInnerHeight() const1065 double UserFormGeometryHelper::getInnerHeight() const
1066 {
1067     return implGetSize( true, false );
1068 }
1069 
setInnerHeight(double fHeight)1070 void UserFormGeometryHelper::setInnerHeight( double fHeight )
1071 {
1072     implSetSize( fHeight, true, false );
1073 }
1074 
getOffsetX() const1075 double UserFormGeometryHelper::getOffsetX() const
1076 {
1077     return mfOffsetX;
1078 }
1079 
getOffsetY() const1080 double UserFormGeometryHelper::getOffsetY() const
1081 {
1082     return mfOffsetY;
1083 }
1084 
1085 // ----------------------------------------------------------------------------
1086 
1087 static const ::rtl::OUString saPosXName( RTL_CONSTASCII_USTRINGPARAM( "PositionX" ) );
1088 static const ::rtl::OUString saPosYName( RTL_CONSTASCII_USTRINGPARAM( "PositionY" ) );
1089 static const ::rtl::OUString saWidthName( RTL_CONSTASCII_USTRINGPARAM( "Width" ) );
1090 static const ::rtl::OUString saHeightName( RTL_CONSTASCII_USTRINGPARAM( "Height" ) );
1091 
implGetPos(bool bPosY) const1092 double UserFormGeometryHelper::implGetPos( bool bPosY ) const
1093 {
1094     sal_Int32 nPosAppFont = mxModelProps->getPropertyValue( bPosY ? saPosYName : saPosXName ).get< sal_Int32 >();
1095     // appfont to pixel
1096     awt::Point aPosPixel = mxUnitConv->convertPointToPixel( awt::Point( nPosAppFont, nPosAppFont ), util::MeasureUnit::APPFONT );
1097     // pixel to VBA points
1098     awt::Point aPosPoint = mxUnitConv->convertPointToLogic( aPosPixel, util::MeasureUnit::POINT );
1099     return bPosY ? (aPosPoint.Y - mfOffsetY) : (aPosPoint.X - mfOffsetX);
1100 }
1101 
implSetPos(double fPos,bool bPosY)1102 void UserFormGeometryHelper::implSetPos( double fPos, bool bPosY )
1103 {
1104     // convert passed VBA points to pixels
1105     sal_Int32 nPosPixel = static_cast< sal_Int32 >( fPos + (bPosY ? mfOffsetY : mfOffsetX) );
1106     awt::Point aPosPixel = mxUnitConv->convertPointToPixel( awt::Point( nPosPixel, nPosPixel ), util::MeasureUnit::POINT );
1107     // pixel to appfont
1108     awt::Point aPosAppFont = mxUnitConv->convertPointToLogic( aPosPixel, util::MeasureUnit::APPFONT );
1109     mxModelProps->setPropertyValue( bPosY ? saPosYName : saPosXName, uno::Any( bPosY ? aPosAppFont.Y : aPosAppFont.X ) );
1110 }
1111 
implGetSize(bool bHeight,bool bOuter) const1112 double UserFormGeometryHelper::implGetSize( bool bHeight, bool bOuter ) const
1113 {
1114     sal_Int32 nSizeAppFont = mxModelProps->getPropertyValue( bHeight ? saHeightName : saWidthName ).get< sal_Int32 >();
1115     // appfont to pixel
1116     awt::Size aSizePixel = mxUnitConv->convertSizeToPixel( awt::Size( nSizeAppFont, nSizeAppFont ), util::MeasureUnit::APPFONT );
1117 
1118     /*  The VBA symbols 'Width' and 'Height' return the outer size including
1119         window decoration (in difference to the symbols 'InnerWidth' and
1120         'InnerHeight'), but the window API returns the inner size. */
1121     if( mbDialog && bOuter )
1122     {
1123         if( const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ) )
1124         {
1125             Rectangle aOuterRect = pWindow->GetWindowExtentsRelative( NULL );
1126             aSizePixel = awt::Size( aOuterRect.getWidth(), aOuterRect.getHeight() );
1127         }
1128     }
1129 
1130     // pixel to VBA points
1131     awt::Size aSizePoint = mxUnitConv->convertSizeToLogic( aSizePixel, util::MeasureUnit::POINT );
1132     return bHeight ? aSizePoint.Height : aSizePoint.Width;
1133 }
1134 
implSetSize(double fSize,bool bHeight,bool bOuter)1135 void UserFormGeometryHelper::implSetSize( double fSize, bool bHeight, bool bOuter )
1136 {
1137     // convert passed VBA points to pixels
1138     sal_Int32 nSize = static_cast< sal_Int32 >( fSize );
1139     awt::Size aSizePixel = mxUnitConv->convertSizeToPixel( awt::Size( nSize, nSize ), util::MeasureUnit::POINT );
1140 
1141     /*  The VBA symbols 'Width' and 'Height' set the outer size (in difference
1142         to the symbols 'InnerWidth' and 'InnerHeight'), but the dialog model
1143         expects the inner size. We have to remove the window extents from the
1144         pixel height to get the same result. */
1145     if ( mbDialog && bOuter )
1146     {
1147         if( const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ) )
1148         {
1149             Rectangle aOuterRect = pWindow->GetWindowExtentsRelative( NULL );
1150             if( !aOuterRect.IsEmpty() )
1151             {
1152                 awt::Rectangle aInnerRect = mxWindow->getPosSize();
1153                 sal_Int32 nDecorWidth = aOuterRect.getWidth() - aInnerRect.Width;
1154                 sal_Int32 nDecorHeight = aOuterRect.getHeight() - aInnerRect.Height;
1155                 aSizePixel.Width = ::std::max< sal_Int32 >( aSizePixel.Width - nDecorWidth, 1 );
1156                 aSizePixel.Height = ::std::max< sal_Int32 >( aSizePixel.Height - nDecorHeight, 1 );
1157             }
1158         }
1159     }
1160 
1161     awt::Size aSizeAppFont = mxUnitConv->convertSizeToLogic( aSizePixel, util::MeasureUnit::APPFONT );
1162     mxModelProps->setPropertyValue( bHeight ? saHeightName : saWidthName, uno::Any( bHeight ? aSizeAppFont.Height : aSizeAppFont.Width ) );
1163 }
1164 
1165 // ============================================================================
1166 
getLeft() const1167     double ConcreteXShapeGeometryAttributes::getLeft() const
1168     {
1169         return m_pShapeHelper->getLeft();
1170     }
setLeft(double nLeft)1171     void ConcreteXShapeGeometryAttributes::setLeft( double nLeft )
1172     {
1173         m_pShapeHelper->setLeft( nLeft );
1174     }
getTop() const1175     double ConcreteXShapeGeometryAttributes::getTop() const
1176     {
1177         return m_pShapeHelper->getTop();
1178     }
setTop(double nTop)1179     void ConcreteXShapeGeometryAttributes::setTop( double nTop )
1180     {
1181         m_pShapeHelper->setTop( nTop );
1182     }
1183 
getHeight() const1184     double ConcreteXShapeGeometryAttributes::getHeight() const
1185     {
1186         return m_pShapeHelper->getHeight();
1187     }
setHeight(double nHeight)1188     void ConcreteXShapeGeometryAttributes::setHeight( double nHeight )
1189     {
1190         m_pShapeHelper->setHeight( nHeight );
1191     }
getWidth() const1192     double ConcreteXShapeGeometryAttributes::getWidth() const
1193     {
1194         return m_pShapeHelper->getWidth();
1195     }
setWidth(double nWidth)1196     void ConcreteXShapeGeometryAttributes::setWidth( double nWidth)
1197     {
1198         m_pShapeHelper->setWidth( nWidth );
1199     }
1200 
1201 
ShapeHelper(const css::uno::Reference<css::drawing::XShape> & _xShape)1202     ShapeHelper::ShapeHelper( const css::uno::Reference< css::drawing::XShape >& _xShape) throw (css::script::BasicErrorException ) : xShape( _xShape )
1203     {
1204         if( !xShape.is() )
1205             throw css::uno::RuntimeException( rtl::OUString::createFromAscii("No valid shape for helper"), css::uno::Reference< css::uno::XInterface >() );
1206     }
1207 
getHeight() const1208     double ShapeHelper::getHeight() const
1209     {
1210             return  Millimeter::getInPoints(xShape->getSize().Height);
1211         }
1212 
1213 
setHeight(double _fheight)1214         void ShapeHelper::setHeight(double _fheight) throw ( css::script::BasicErrorException )
1215     {
1216         try
1217         {
1218             css::awt::Size aSize = xShape->getSize();
1219             aSize.Height = Millimeter::getInHundredthsOfOneMillimeter(_fheight);
1220             xShape->setSize(aSize);
1221         }
1222         catch ( css::uno::Exception& /*e*/)
1223         {
1224             throw css::script::BasicErrorException( rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
1225             }
1226     }
1227 
1228 
getWidth() const1229     double ShapeHelper::getWidth() const
1230     {
1231         return Millimeter::getInPoints(xShape->getSize().Width);
1232         }
1233 
setWidth(double _fWidth)1234     void ShapeHelper::setWidth(double _fWidth) throw ( css::script::BasicErrorException )
1235     {
1236         try
1237         {
1238             css::awt::Size aSize = xShape->getSize();
1239             aSize.Width = Millimeter::getInHundredthsOfOneMillimeter(_fWidth);
1240             xShape->setSize(aSize);
1241         }
1242         catch (css::uno::Exception& /*e*/)
1243         {
1244             throw css::script::BasicErrorException( rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), SbERR_METHOD_FAILED, rtl::OUString() );
1245         }
1246     }
1247 
1248 
getLeft() const1249     double ShapeHelper::getLeft() const
1250     {
1251         return Millimeter::getInPoints(xShape->getPosition().X);
1252     }
1253 
1254 
setLeft(double _fLeft)1255     void ShapeHelper::setLeft(double _fLeft)
1256     {
1257         css::awt::Point aPoint = xShape->getPosition();
1258         aPoint.X = Millimeter::getInHundredthsOfOneMillimeter(_fLeft);
1259         xShape->setPosition(aPoint);
1260     }
1261 
1262 
getTop() const1263     double ShapeHelper::getTop() const
1264     {
1265             return Millimeter::getInPoints(xShape->getPosition().Y);
1266     }
1267 
1268 
setTop(double _fTop)1269     void ShapeHelper::setTop(double _fTop)
1270     {
1271         css::awt::Point aPoint = xShape->getPosition();
1272         aPoint.Y = Millimeter::getInHundredthsOfOneMillimeter(_fTop);
1273         xShape->setPosition(aPoint);
1274     }
1275 
exception(const rtl::OUString & DetailedMessage,const css::uno::Exception & ex,int err,const rtl::OUString &)1276     void DebugHelper::exception( const rtl::OUString&  DetailedMessage, const css::uno::Exception& ex,  int err, const rtl::OUString& /*additionalArgument*/ ) throw( css::script::BasicErrorException )
1277     {
1278         // #TODO #FIXME ( do we want to support additionalArg here )
1279         throw css::script::BasicErrorException( DetailedMessage.concat( rtl::OUString::createFromAscii(" ") ).concat( ex.Message ), css::uno::Reference< css::uno::XInterface >(), err, rtl::OUString() );
1280     }
1281 
exception(int err,const rtl::OUString & additionalArgument)1282     void DebugHelper::exception( int err,  const rtl::OUString& additionalArgument ) throw( css::script::BasicErrorException )
1283     {
1284         exception( rtl::OUString(), css::uno::Exception(), err, additionalArgument );
1285     }
exception(css::uno::Exception & ex)1286     void DebugHelper::exception( css::uno::Exception& ex ) throw( css::script::BasicErrorException )
1287     {
1288         exception( rtl::OUString(), ex, SbERR_INTERNAL_ERROR, rtl::OUString() );
1289     }
1290 
Millimeter()1291     Millimeter::Millimeter():m_nMillimeter(0) {}
1292 
Millimeter(double mm)1293     Millimeter::Millimeter(double mm):m_nMillimeter(mm) {}
1294 
set(double mm)1295     void Millimeter::set(double mm) { m_nMillimeter = mm; }
setInPoints(double points)1296     void Millimeter::setInPoints(double points)
1297     {
1298         m_nMillimeter = points * factor / 100.0;
1299     }
1300 
setInHundredthsOfOneMillimeter(double hmm)1301     void Millimeter::setInHundredthsOfOneMillimeter(double hmm)
1302     {
1303         m_nMillimeter = hmm / 100;
1304     }
1305 
get()1306     double Millimeter::get()
1307     {
1308         return m_nMillimeter;
1309     }
getInHundredthsOfOneMillimeter()1310     double Millimeter::getInHundredthsOfOneMillimeter()
1311     {
1312         return m_nMillimeter * 100;
1313     }
getInPoints()1314     double Millimeter::getInPoints()
1315     {
1316         return m_nMillimeter / factor * 100.0;
1317     }
1318 
getInHundredthsOfOneMillimeter(double points)1319     sal_Int32 Millimeter::getInHundredthsOfOneMillimeter(double points)
1320     {
1321         sal_Int32 mm = static_cast<sal_Int32>(points * factor);
1322         return mm;
1323     }
1324 
getInPoints(int _hmm)1325     double Millimeter::getInPoints(int _hmm)
1326     {
1327         double points = double( static_cast<double>(_hmm) / factor);
1328         return points;
1329     }
1330 
getVBADocument(const uno::Reference<frame::XModel> & xModel)1331 uno::Reference< XHelperInterface > getVBADocument( const uno::Reference< frame::XModel >& xModel )
1332 {
1333     uno::Reference< XHelperInterface > xIf;
1334     try
1335     {
1336         uno::Reference< beans::XPropertySet > xDocProps( xModel, uno::UNO_QUERY_THROW );
1337         ::rtl::OUString aCodeName;
1338         xDocProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CodeName" ) ) ) >>= aCodeName;
1339         xIf = getUnoDocModule( aCodeName, getSfxObjShell( xModel ) );
1340     }
1341     catch( uno::Exception& )
1342     {
1343     }
1344     return xIf;
1345 }
1346 
getUnoDocModule(const String & aModName,SfxObjectShell * pShell)1347 uno::Reference< XHelperInterface > getUnoDocModule( const String& aModName, SfxObjectShell* pShell )
1348 {
1349     uno::Reference< XHelperInterface > xIf;
1350     if ( pShell )
1351     {
1352         rtl::OUString sProj( RTL_CONSTASCII_USTRINGPARAM("Standard") );
1353         BasicManager* pBasMgr = pShell->GetBasicManager();
1354         if ( pBasMgr && pBasMgr->GetName().Len() )
1355             sProj = pBasMgr->GetName();
1356         if( StarBASIC* pBasic = pShell->GetBasicManager()->GetLib( sProj ) )
1357             if( SbModule* pMod = pBasic->FindModule( aModName ) )
1358                 xIf.set( pMod->GetUnoModule(), uno::UNO_QUERY );
1359     }
1360     return xIf;
1361 }
1362 
getSfxObjShell(const uno::Reference<frame::XModel> & xModel)1363 SfxObjectShell* getSfxObjShell( const uno::Reference< frame::XModel >& xModel ) throw (uno::RuntimeException)
1364 {
1365     SfxObjectShell* pFoundShell = NULL;
1366     if ( xModel.is() )
1367     {
1368         uno::Reference< lang::XUnoTunnel >  xObjShellTunnel( xModel, uno::UNO_QUERY_THROW );
1369         pFoundShell = reinterpret_cast<SfxObjectShell*>( xObjShellTunnel->getSomething(SfxObjectShell::getUnoTunnelId()));
1370     }
1371     if ( !pFoundShell )
1372         throw uno::RuntimeException();
1373     return pFoundShell;
1374 }
1375 
1376 } // openoffice
1377 } //org
1378