LCOV - code coverage report
Current view: top level - vbahelper/source/msforms - vbauserform.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 42 141 29.8 %
Date: 2015-06-13 12:38:46 Functions: 8 27 29.6 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : #include <vbahelper/helperdecl.hxx>
      20             : #include "vbauserform.hxx"
      21             : #include <com/sun/star/awt/XControl.hpp>
      22             : #include <com/sun/star/awt/XControlContainer.hpp>
      23             : #include <com/sun/star/awt/XWindow2.hpp>
      24             : #include <com/sun/star/awt/PosSize.hpp>
      25             : #include <com/sun/star/beans/PropertyConcept.hpp>
      26             : #include <com/sun/star/container/XNameContainer.hpp>
      27             : #include <com/sun/star/util/MeasureUnit.hpp>
      28             : #include <basic/sbx.hxx>
      29             : #include <basic/sbstar.hxx>
      30             : #include <basic/sbmeth.hxx>
      31             : #include "vbacontrols.hxx"
      32             : 
      33             : using namespace ::ooo::vba;
      34             : using namespace ::com::sun::star;
      35             : 
      36             : // some little notes
      37             : // XDialog implementation has the following interesting bits
      38             : // a Controls property ( which is an array of the container controls )
      39             : //   each item in the controls array is a XControl, where the model is
      40             : //   basically a property bag
      41             : // additionally the XDialog instance has itself a model
      42             : //     this model has a ControlModels ( array of models ) property
      43             : //     the models in ControlModels can be accessed by name
      44             : // also the XDialog is a XControl ( to access the model above
      45             : 
      46           2 : ScVbaUserForm::ScVbaUserForm( uno::Sequence< uno::Any > const& aArgs, uno::Reference< uno::XComponentContext >const& xContext ) throw ( lang::IllegalArgumentException, uno::RuntimeException ) :  ScVbaUserForm_BASE( getXSomethingFromArgs< XHelperInterface >( aArgs, 0 ), xContext, getXSomethingFromArgs< uno::XInterface >( aArgs, 1 ), getXSomethingFromArgs< frame::XModel >( aArgs, 2 ), static_cast< ooo::vba::AbstractGeometryAttributes* >(0) ),  mbDispose( true )
      47             : {
      48           2 :     m_xDialog.set( m_xControl, uno::UNO_QUERY_THROW );
      49           2 :     uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW );
      50           2 :     m_xProps.set( xControl->getModel(), uno::UNO_QUERY_THROW );
      51           2 :     setGeometryHelper( new UserFormGeometryHelper( xContext, xControl, 0.0, 0.0 ) );
      52           2 :     if ( aArgs.getLength() >= 4 )
      53           2 :         aArgs[ 3 ] >>= m_sLibName;
      54           2 : }
      55             : 
      56           2 : ScVbaUserForm::~ScVbaUserForm()
      57             : {
      58           2 : }
      59             : 
      60             : void SAL_CALL
      61           0 : ScVbaUserForm::Show(  ) throw (uno::RuntimeException, std::exception)
      62             : {
      63             :     SAL_INFO("vbahelper", "ScVbaUserForm::Show(  )");
      64           0 :     short aRet = 0;
      65           0 :     mbDispose = true;
      66             : 
      67           0 :     if ( m_xDialog.is() )
      68             :     {
      69             :         // try to center dialog on model window
      70           0 :         if( m_xModel.is() ) try
      71             :         {
      72           0 :             uno::Reference< frame::XController > xController( m_xModel->getCurrentController(), uno::UNO_SET_THROW );
      73           0 :             uno::Reference< frame::XFrame > xFrame( xController->getFrame(), uno::UNO_SET_THROW );
      74           0 :             uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow(), uno::UNO_SET_THROW );
      75           0 :             awt::Rectangle aPosSize = xWindow->getPosSize();    // already in pixel
      76             : 
      77           0 :             uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW );
      78           0 :             uno::Reference< awt::XWindow > xControlWindow( xControl->getPeer(), uno::UNO_QUERY_THROW );
      79           0 :             xControlWindow->setPosSize(static_cast<sal_Int32>((aPosSize.Width - getWidth()) / 2.0), static_cast<sal_Int32>((aPosSize.Height - getHeight()) / 2.0), 0, 0, awt::PosSize::POS );
      80             :         }
      81           0 :         catch( uno::Exception& )
      82             :         {
      83             :         }
      84             : 
      85           0 :         aRet = m_xDialog->execute();
      86             :     }
      87             :     SAL_INFO("vbahelper", "ScVbaUserForm::Show() execute returned " << aRet);
      88           0 :     if ( mbDispose )
      89             :     {
      90             :         try
      91             :         {
      92           0 :             uno::Reference< lang::XComponent > xComp( m_xDialog, uno::UNO_QUERY_THROW );
      93           0 :             m_xDialog = NULL;
      94           0 :             xComp->dispose();
      95           0 :             mbDispose = false;
      96             :         }
      97           0 :         catch( uno::Exception& )
      98             :         {
      99             :         }
     100             :     }
     101           0 : }
     102             : 
     103             : OUString SAL_CALL
     104           0 : ScVbaUserForm::getCaption() throw (uno::RuntimeException, std::exception)
     105             : {
     106           0 :     OUString sCaption;
     107           0 :     m_xProps->getPropertyValue( "Title" ) >>= sCaption;
     108           0 :     return sCaption;
     109             : }
     110             : void
     111           0 : ScVbaUserForm::setCaption( const OUString& _caption ) throw (uno::RuntimeException, std::exception)
     112             : {
     113           0 :     m_xProps->setPropertyValue( "Title", uno::makeAny( _caption ) );
     114           0 : }
     115             : 
     116             : sal_Bool SAL_CALL
     117           0 : ScVbaUserForm::getVisible() throw (uno::RuntimeException, std::exception)
     118             : {
     119           0 :     uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW );
     120           0 :     uno::Reference< awt::XWindow2 > xControlWindow( xControl->getPeer(), uno::UNO_QUERY_THROW );
     121           0 :     return xControlWindow->isVisible();
     122             : }
     123             : 
     124             : void SAL_CALL
     125           0 : ScVbaUserForm::setVisible( sal_Bool bVis ) throw (uno::RuntimeException, std::exception)
     126             : {
     127           0 :     if ( bVis )
     128           0 :         Show();
     129             :     else
     130           0 :         Hide();
     131           0 : }
     132             : 
     133           0 : double SAL_CALL ScVbaUserForm::getInnerWidth() throw (uno::RuntimeException, std::exception)
     134             : {
     135           0 :     return mpGeometryHelper->getInnerWidth();
     136             : }
     137             : 
     138           0 : void SAL_CALL ScVbaUserForm::setInnerWidth( double fInnerWidth ) throw (uno::RuntimeException, std::exception)
     139             : {
     140           0 :     mpGeometryHelper->setInnerWidth( fInnerWidth );
     141           0 : }
     142             : 
     143           0 : double SAL_CALL ScVbaUserForm::getInnerHeight() throw (uno::RuntimeException, std::exception)
     144             : {
     145           0 :     return mpGeometryHelper->getInnerHeight();
     146             : }
     147             : 
     148           0 : void SAL_CALL ScVbaUserForm::setInnerHeight( double fInnerHeight ) throw (uno::RuntimeException, std::exception)
     149             : {
     150           0 :     mpGeometryHelper->setInnerHeight( fInnerHeight );
     151           0 : }
     152             : 
     153             : void SAL_CALL
     154           0 : ScVbaUserForm::Hide(  ) throw (uno::RuntimeException, std::exception)
     155             : {
     156           0 :     mbDispose = false;  // hide not dispose
     157           0 :     if ( m_xDialog.is() )
     158           0 :         m_xDialog->endExecute();
     159           0 : }
     160             : 
     161             : void SAL_CALL
     162           0 : ScVbaUserForm::RePaint(  ) throw (uno::RuntimeException, std::exception)
     163             : {
     164             :     // #STUB
     165             :     // do nothing
     166           0 : }
     167             : 
     168             : void SAL_CALL
     169           0 : ScVbaUserForm::UnloadObject(  ) throw (uno::RuntimeException, std::exception)
     170             : {
     171           0 :     mbDispose = true;
     172           0 :     if ( m_xDialog.is() )
     173           0 :         m_xDialog->endExecute();
     174           0 : }
     175             : 
     176             : OUString
     177           0 : ScVbaUserForm::getServiceImplName()
     178             : {
     179           0 :     return OUString("ScVbaUserForm");
     180             : }
     181             : 
     182             : uno::Sequence< OUString >
     183           0 : ScVbaUserForm::getServiceNames()
     184             : {
     185           0 :     static uno::Sequence< OUString > aServiceNames;
     186           0 :     if ( aServiceNames.getLength() == 0 )
     187             :     {
     188           0 :         aServiceNames.realloc( 1 );
     189           0 :         aServiceNames[ 0 ] = "ooo.vba.excel.UserForm";
     190             :     }
     191           0 :     return aServiceNames;
     192             : }
     193             : 
     194             : uno::Reference< beans::XIntrospectionAccess > SAL_CALL
     195           0 : ScVbaUserForm::getIntrospection(  ) throw (uno::RuntimeException, std::exception)
     196             : {
     197           0 :     return uno::Reference< beans::XIntrospectionAccess >();
     198             : }
     199             : 
     200             : uno::Any SAL_CALL
     201           0 : ScVbaUserForm::invoke( const OUString& /*aFunctionName*/, const uno::Sequence< uno::Any >& /*aParams*/, uno::Sequence< ::sal_Int16 >& /*aOutParamIndex*/, uno::Sequence< uno::Any >& /*aOutParam*/ ) throw (lang::IllegalArgumentException, script::CannotConvertException, reflection::InvocationTargetException, uno::RuntimeException, std::exception)
     202             : {
     203           0 :     throw uno::RuntimeException(); // unsupported operation
     204             : }
     205             : 
     206             : void SAL_CALL
     207           0 : ScVbaUserForm::setValue( const OUString& aPropertyName, const uno::Any& aValue ) throw (beans::UnknownPropertyException, script::CannotConvertException, reflection::InvocationTargetException, uno::RuntimeException, std::exception)
     208             : {
     209           0 :     uno::Any aObject = getValue( aPropertyName );
     210             : 
     211             :     // in case the dialog is already closed the VBA implementation should not throw exceptions
     212           0 :     if ( aObject.hasValue() )
     213             :     {
     214             :         // The Object *must* support XDefaultProperty here because getValue will
     215             :         // only return properties that are Objects ( e.g. controls )
     216             :         // e.g. Userform1.aControl = something
     217             :         // 'aControl' has to support XDefaultProperty to make sense here
     218           0 :         uno::Reference< script::XDefaultProperty > xDfltProp( aObject, uno::UNO_QUERY_THROW );
     219           0 :         OUString aDfltPropName = xDfltProp->getDefaultPropertyName();
     220           0 :         uno::Reference< beans::XIntrospectionAccess > xUnoAccess( getIntrospectionAccess( aObject ) );
     221           0 :         uno::Reference< beans::XPropertySet > xPropSet( xUnoAccess->queryAdapter( cppu::UnoType<beans::XPropertySet>::get()), uno::UNO_QUERY_THROW );
     222           0 :         xPropSet->setPropertyValue( aDfltPropName, aValue );
     223           0 :     }
     224           0 : }
     225             : 
     226             : uno::Reference< awt::XControl >
     227          51 : ScVbaUserForm::nestedSearch( const OUString& aPropertyName, uno::Reference< awt::XControlContainer >& xContainer )
     228             : {
     229          51 :     uno::Reference< awt::XControl > xControl = xContainer->getControl( aPropertyName );
     230          51 :     if ( !xControl.is() )
     231             :     {
     232           0 :         uno::Sequence< uno::Reference< awt::XControl > > aControls = xContainer->getControls();
     233           0 :         const uno::Reference< awt::XControl >* pCtrl = aControls.getConstArray();
     234           0 :         const uno::Reference< awt::XControl >* pCtrlsEnd = pCtrl + aControls.getLength();
     235             : 
     236           0 :         for ( ; pCtrl < pCtrlsEnd; ++pCtrl )
     237             :         {
     238           0 :             uno::Reference< awt::XControlContainer > xC( *pCtrl, uno::UNO_QUERY );
     239           0 :             if ( xC.is() )
     240             :             {
     241           0 :                 xControl.set( nestedSearch( aPropertyName, xC ) );
     242           0 :                 if ( xControl.is() )
     243           0 :                     break;
     244             :             }
     245           0 :         }
     246             :     }
     247          51 :     return xControl;
     248             : }
     249             : 
     250             : uno::Any SAL_CALL
     251          51 : ScVbaUserForm::getValue( const OUString& aPropertyName ) throw (beans::UnknownPropertyException, uno::RuntimeException, std::exception)
     252             : {
     253          51 :     uno::Any aResult;
     254             : 
     255             :     // in case the dialog is already closed the VBA implementation should not throw exceptions
     256          51 :     if ( m_xDialog.is() )
     257             :     {
     258          51 :         uno::Reference< awt::XControl > xDialogControl( m_xDialog, uno::UNO_QUERY_THROW );
     259         102 :         uno::Reference< awt::XControlContainer > xContainer( m_xDialog, uno::UNO_QUERY_THROW );
     260         102 :         uno::Reference< awt::XControl > xControl = nestedSearch( aPropertyName, xContainer );
     261          51 :         xContainer->getControl( aPropertyName );
     262          51 :         if ( xControl.is() )
     263             :         {
     264          51 :             uno::Reference< msforms::XControl > xVBAControl = ScVbaControlFactory::createUserformControl( mxContext, xControl, xDialogControl, m_xModel, mpGeometryHelper->getOffsetX(), mpGeometryHelper->getOffsetY() );
     265          51 :             ScVbaControl* pControl  = dynamic_cast< ScVbaControl* >( xVBAControl.get() );
     266          51 :             if (pControl && !m_sLibName.isEmpty())
     267          51 :                 pControl->setLibraryAndCodeName( m_sLibName.concat( "." ).concat( getName() ) );
     268          51 :             aResult = uno::makeAny( xVBAControl );
     269          51 :         }
     270             :     }
     271             : 
     272          51 :     return aResult;
     273             : }
     274             : 
     275             : sal_Bool SAL_CALL
     276          58 : ScVbaUserForm::hasMethod( const OUString& /*aName*/ ) throw (uno::RuntimeException, std::exception)
     277             : {
     278          58 :     return sal_False;
     279             : }
     280             : uno::Any SAL_CALL
     281           0 : ScVbaUserForm::Controls( const uno::Any& index ) throw (uno::RuntimeException, std::exception)
     282             : {
     283             :     // if the dialog already closed we should do nothing, but the VBA will call methods of the Controls objects
     284             :     // thus we have to provide a dummy object in this case
     285           0 :     uno::Reference< awt::XControl > xDialogControl( m_xDialog, uno::UNO_QUERY );
     286           0 :     uno::Reference< XCollection > xControls( new ScVbaControls( this, mxContext, xDialogControl, m_xModel, mpGeometryHelper->getOffsetX(), mpGeometryHelper->getOffsetY() ) );
     287           0 :     if ( index.hasValue() )
     288           0 :         return xControls->Item( index, uno::Any() );
     289           0 :     return uno::makeAny( xControls );
     290             : }
     291             : 
     292             : sal_Bool SAL_CALL
     293          12 : ScVbaUserForm::hasProperty( const OUString& aName ) throw (uno::RuntimeException, std::exception)
     294             : {
     295          12 :     uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY );
     296             : 
     297             :     SAL_INFO("vbahelper", "ScVbaUserForm::hasProperty(" << aName << ") " << xControl.is() );
     298          12 :     if ( xControl.is() )
     299             :     {
     300          12 :         uno::Reference< beans::XPropertySet > xDlgProps( xControl->getModel(), uno::UNO_QUERY );
     301          12 :         if ( xDlgProps.is() )
     302             :         {
     303          12 :             uno::Reference< container::XNameContainer > xAllChildren( xDlgProps->getPropertyValue( "AllDialogChildren" ), uno::UNO_QUERY_THROW );
     304          12 :             bool bRes =  xAllChildren->hasByName( aName );
     305             :             SAL_INFO("vbahelper", "ScVbaUserForm::hasProperty(" << aName << ") " << xAllChildren.is() << " ---> " << bRes );
     306          12 :             return bRes;
     307           0 :         }
     308             :     }
     309           0 :     return sal_False;
     310             : }
     311             : 
     312             : namespace userform
     313             : {
     314             : namespace sdecl = comphelper::service_decl;
     315           2 : sdecl::vba_service_class_<ScVbaUserForm, sdecl::with_args<true> > serviceImpl;
     316           2 : extern sdecl::ServiceDecl const serviceDecl(
     317             :     serviceImpl,
     318             :     "ScVbaUserForm",
     319             :     "ooo.vba.msforms.UserForm" );
     320           6 : }
     321             : 
     322             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11