diff options
author | Daniel Rentz [dr] <daniel.rentz@oracle.com> | 2010-12-27 12:33:29 +0100 |
---|---|---|
committer | Daniel Rentz [dr] <daniel.rentz@oracle.com> | 2010-12-27 12:33:29 +0100 |
commit | e2c8828ad409bdc08873372af808cf7f1ba5ef98 (patch) | |
tree | ea1c5e7944ba36cda6e36e8aca5896ab997f140c /vbahelper | |
parent | b0349f7d5087f2e960939f3fcddc6423a60cdd32 (diff) | |
parent | 04afdea56a69c2418231e0881dc37a8f490b1147 (diff) |
dr77: rebase to DEV300m96
Diffstat (limited to 'vbahelper')
-rw-r--r-- | vbahelper/inc/vbahelper/vbadocumentsbase.hxx | 8 | ||||
-rwxr-xr-x | vbahelper/inc/vbahelper/vbaeventshelperbase.hxx | 26 | ||||
-rw-r--r-- | vbahelper/inc/vbahelper/vbahelper.hxx | 7 | ||||
-rw-r--r-- | vbahelper/prj/build.lst | 2 | ||||
-rw-r--r-- | vbahelper/source/msforms/makefile.mk | 9 | ||||
-rw-r--r-- | vbahelper/source/msforms/vbacontrol.cxx | 1 | ||||
-rw-r--r-- | vbahelper/source/msforms/vbauserform.cxx | 36 | ||||
-rw-r--r-- | vbahelper/source/vbahelper/makefile.mk | 8 | ||||
-rw-r--r-- | vbahelper/source/vbahelper/vbaapplicationbase.cxx | 57 | ||||
-rw-r--r-- | vbahelper/source/vbahelper/vbacommandbarcontrol.cxx | 40 | ||||
-rw-r--r-- | vbahelper/source/vbahelper/vbadocumentbase.cxx | 95 | ||||
-rw-r--r-- | vbahelper/source/vbahelper/vbadocumentsbase.cxx | 23 | ||||
-rwxr-xr-x | vbahelper/source/vbahelper/vbaeventshelperbase.cxx | 29 | ||||
-rw-r--r-- | vbahelper/source/vbahelper/vbahelper.cxx | 286 |
14 files changed, 264 insertions, 363 deletions
diff --git a/vbahelper/inc/vbahelper/vbadocumentsbase.hxx b/vbahelper/inc/vbahelper/vbadocumentsbase.hxx index 82f9ead18d..3a5c0f48f0 100644 --- a/vbahelper/inc/vbahelper/vbadocumentsbase.hxx +++ b/vbahelper/inc/vbahelper/vbadocumentsbase.hxx @@ -57,10 +57,10 @@ public: // VbaDocumentsBase_BASE virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ) = 0; - // XDocumentsBase - virtual css::uno::Any SAL_CALL Add() throw (css::uno::RuntimeException); - virtual void SAL_CALL Close( ) throw (css::uno::RuntimeException); - virtual css::uno::Any SAL_CALL Open( const ::rtl::OUString& Filename, const css::uno::Any& ReadOnly, const css::uno::Sequence< css::beans::PropertyValue >& rProps ) throw (css::uno::RuntimeException); +protected: + css::uno::Any createDocument() throw (css::uno::RuntimeException); + void closeDocuments() throw (css::uno::RuntimeException); + css::uno::Any openDocument( const ::rtl::OUString& Filename, const css::uno::Any& ReadOnly, const css::uno::Sequence< css::beans::PropertyValue >& rProps ) throw (css::uno::RuntimeException); }; #endif /* SC_VBA_WORKBOOKS_HXX */ diff --git a/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx b/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx index b0dd184c1a..c328e316ff 100755 --- a/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx +++ b/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx @@ -58,6 +58,17 @@ public: // XEventListener virtual void SAL_CALL disposing( const css::lang::EventObject& aSource ) throw (css::uno::RuntimeException); + // little helpers --------------------------------------------------------- + + /** Throws, if the passed sequence does not contain a value at the specified index. */ + static inline void checkArgument( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException) + { if( (nIndex < 0) || (nIndex >= rArgs.getLength()) ) throw css::lang::IllegalArgumentException(); } + + /** Throws, if the passed sequence does not contain a value of a specific at the specified index. */ + template< typename Type > + static inline void checkArgumentType( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException) + { checkArgument( rArgs, nIndex ); if( !rArgs[ nIndex ].has< Type >() ) throw css::lang::IllegalArgumentException(); } + protected: // ------------------------------------------------------------------------ @@ -73,7 +84,7 @@ protected: /** Registers a supported event handler. - @param nEventId Event identifier from com.sun.star.script.vba.EventIdentifier. + @param nEventId Event identifier from com.sun.star.script.vba.VBAEventId. @param pcMacroName Name of the associated VBA event handler macro. @param eType Document event or global event. @param nCancelIndex 0-based index of Cancel parameter, or -1. @@ -85,15 +96,6 @@ protected: sal_Int32 nCancelIndex = -1, const css::uno::Any& rUserData = css::uno::Any() ); - /** Throws, if the passed sequence does not contain a value at the specified index. */ - static inline void checkArgument( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException) - { if( rArgs.getLength() <= nIndex ) throw css::lang::IllegalArgumentException(); } - - /** Throws, if the passed sequence does not contain a value of a specific at the specified index. */ - template< typename Type > - static inline void checkArgumentType( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException) - { if( (rArgs.getLength() <= nIndex) || !rArgs[ nIndex ].has< Type >() ) throw css::lang::IllegalArgumentException(); } - // ------------------------------------------------------------------------ struct EventQueueEntry @@ -105,10 +107,6 @@ protected: }; typedef ::std::deque< EventQueueEntry > EventQueue; - /** Derived classes return whether event processing is enabled. Throws if - the instance is in an invalid state. */ - virtual bool implEventsEnabled() throw (css::uno::RuntimeException) = 0; - /** Derived classes do additional prpeparations and return whether the event handler has to be called. */ virtual bool implPrepareEvent( diff --git a/vbahelper/inc/vbahelper/vbahelper.hxx b/vbahelper/inc/vbahelper/vbahelper.hxx index 77c5338442..4a73ec2e03 100644 --- a/vbahelper/inc/vbahelper/vbahelper.hxx +++ b/vbahelper/inc/vbahelper/vbahelper.hxx @@ -194,11 +194,8 @@ public: #define VBA_WIDTH "Width" class VBAHELPER_DLLPUBLIC UserFormGeometryHelper : public AbstractGeometryAttributes { - css::uno::Reference< css::awt::XUnitConversion > mxControlUnits; - css::uno::Reference< css::beans::XPropertySet > mxModel; - - sal_Int32 ConvertLogicToPixel( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nSourceUnit ); - sal_Int32 ConvertPixelToLogic( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nTargetUnit ); + css::uno::Reference< css::awt::XWindow > mxWindow; + sal_Bool mbDialog; public: UserFormGeometryHelper( const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::awt::XControl >& xControl ); diff --git a/vbahelper/prj/build.lst b/vbahelper/prj/build.lst index 20001db859..0fadb0c946 100644 --- a/vbahelper/prj/build.lst +++ b/vbahelper/prj/build.lst @@ -1,4 +1,4 @@ -vba vbahelper : oovbaapi basic sfx2 svx filter cppuhelper vcl comphelper svtools tools sal NULL +vba vbahelper : oovbaapi offuh basic sfx2 svx filter cppuhelper vcl comphelper svtools tools sal LIBXSLT:libxslt NULL vba vbahelper usr1 - all vba_mkout NULL #vba vbahelper\inc nmake - all vba_inc NULL vba vbahelper\source\vbahelper nmake - all vba_vbahelper NULL diff --git a/vbahelper/source/msforms/makefile.mk b/vbahelper/source/msforms/makefile.mk index 5fce64649d..40a6b8350f 100644 --- a/vbahelper/source/msforms/makefile.mk +++ b/vbahelper/source/msforms/makefile.mk @@ -70,12 +70,3 @@ SLOFILES=\ .INCLUDE : target.mk -ALLTAR : \ - $(MISC)$/$(TARGET).don \ - -$(SLOFILES) : $(MISC)$/$(TARGET).don - -$(MISC)$/$(TARGET).don : $(SOLARBINDIR)$/oovbaapi.rdb - +$(CPPUMAKER) -O$(INCCOM)$/$(TARGET) -BUCR $(SOLARBINDIR)$/oovbaapi.rdb -X$(SOLARBINDIR)$/types.rdb && echo > $@ - echo $@ - diff --git a/vbahelper/source/msforms/vbacontrol.cxx b/vbahelper/source/msforms/vbacontrol.cxx index 7485073321..28f6d7f61c 100644 --- a/vbahelper/source/msforms/vbacontrol.cxx +++ b/vbahelper/source/msforms/vbacontrol.cxx @@ -227,7 +227,6 @@ void SAL_CALL ScVbaControl::setLeft( double _left ) throw (uno::RuntimeException) { mpGeometryHelper->setLeft( _left ); - } double SAL_CALL diff --git a/vbahelper/source/msforms/vbauserform.cxx b/vbahelper/source/msforms/vbauserform.cxx index 33e357b00c..3db05ee747 100644 --- a/vbahelper/source/msforms/vbauserform.cxx +++ b/vbahelper/source/msforms/vbauserform.cxx @@ -28,7 +28,9 @@ #include "vbauserform.hxx" #include <com/sun/star/awt/XControl.hpp> #include <com/sun/star/awt/XControlContainer.hpp> +#include <com/sun/star/awt/PosSize.hpp> #include <com/sun/star/beans/PropertyConcept.hpp> +#include <com/sun/star/util/MeasureUnit.hpp> #include <basic/sbx.hxx> #include <basic/sbstar.hxx> #include <basic/sbmeth.hxx> @@ -64,9 +66,28 @@ ScVbaUserForm::Show( ) throw (uno::RuntimeException) { OSL_TRACE("ScVbaUserForm::Show( )"); short aRet = 0; - mbDispose = true; + mbDispose = true; + if ( m_xDialog.is() ) + { + // try to center dialog on model window + if( m_xModel.is() ) try + { + uno::Reference< frame::XController > xController( m_xModel->getCurrentController(), uno::UNO_SET_THROW ); + uno::Reference< frame::XFrame > xFrame( xController->getFrame(), uno::UNO_SET_THROW ); + uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow(), uno::UNO_SET_THROW ); + awt::Rectangle aPosSize = xWindow->getPosSize(); // already in pixel + + uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW ); + uno::Reference< awt::XWindow > xControlWindow( xControl->getPeer(), uno::UNO_QUERY_THROW ); + xControlWindow->setPosSize( (aPosSize.Width - getWidth()) / 2.0, (aPosSize.Height - getHeight()) / 2.0, 0, 0, awt::PosSize::POS ); + } + catch( uno::Exception& ) + { + } + aRet = m_xDialog->execute(); + } OSL_TRACE("ScVbaUserForm::Show() execute returned %d", aRet); if ( mbDispose ) { @@ -180,11 +201,14 @@ ScVbaUserForm::getValue( const ::rtl::OUString& aPropertyName ) throw (beans::Un uno::Reference< awt::XControl > xDialogControl( m_xDialog, uno::UNO_QUERY_THROW ); uno::Reference< awt::XControlContainer > xContainer( m_xDialog, uno::UNO_QUERY_THROW ); uno::Reference< awt::XControl > xControl = xContainer->getControl( aPropertyName ); - ScVbaControlFactory aFac( mxContext, xControl, m_xModel ); - uno::Reference< msforms::XControl > xVBAControl( aFac.createControl( xDialogControl->getModel() ) ); - ScVbaControl* pControl = dynamic_cast< ScVbaControl* >( xVBAControl.get() ); - pControl->setGeometryHelper( new UserFormGeometryHelper( mxContext, xControl ) ); - aResult = uno::makeAny( xVBAControl ); + if ( xControl.is() ) + { + ScVbaControlFactory aFac( mxContext, xControl, m_xModel ); + uno::Reference< msforms::XControl > xVBAControl( aFac.createControl( xDialogControl->getModel() ) ); + ScVbaControl* pControl = dynamic_cast< ScVbaControl* >( xVBAControl.get() ); + pControl->setGeometryHelper( new UserFormGeometryHelper( mxContext, xControl ) ); + aResult = uno::makeAny( xVBAControl ); + } } return aResult; diff --git a/vbahelper/source/vbahelper/makefile.mk b/vbahelper/source/vbahelper/makefile.mk index 22ed40a3ad..51fa5b449d 100644 --- a/vbahelper/source/vbahelper/makefile.mk +++ b/vbahelper/source/vbahelper/makefile.mk @@ -71,12 +71,4 @@ SLOFILES=\ .INCLUDE : target.mk -ALLTAR : \ - $(MISC)$/$(TARGET).don \ - -$(SLOFILES) : $(MISC)$/$(TARGET).don - -$(MISC)$/$(TARGET).don : $(SOLARBINDIR)$/oovbaapi.rdb - +$(CPPUMAKER) -O$(INCCOM)$/$(TARGET) -BUCR $(SOLARBINDIR)$/oovbaapi.rdb -X$(SOLARBINDIR)$/types.rdb && echo > $@ - echo $@ diff --git a/vbahelper/source/vbahelper/vbaapplicationbase.cxx b/vbahelper/source/vbahelper/vbaapplicationbase.cxx index 567153db35..f4825f09e2 100644 --- a/vbahelper/source/vbahelper/vbaapplicationbase.cxx +++ b/vbahelper/source/vbahelper/vbaapplicationbase.cxx @@ -295,54 +295,23 @@ VbaApplicationBase::getVersion() throw (uno::RuntimeException) void 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) { - ::rtl::OUString sSeparator = ::rtl::OUString::createFromAscii("/"); - ::rtl::OUString sMacroSeparator = ::rtl::OUString::createFromAscii("!"); - ::rtl::OUString sMacro_only_Name; - sal_Int32 Position_MacroSeparator = MacroName.indexOf(sMacroSeparator); + ::rtl::OUString aMacroName = MacroName.trim(); + if (0 == aMacroName.indexOf('!')) + aMacroName = aMacroName.copy(1).trim(); - uno::Reference< frame::XModel > aMacroDocumentModel; - if (-1 != Position_MacroSeparator) - { - uno::Reference< container::XEnumerationAccess > xComponentEnumAccess; - uno::Reference< lang::XMultiComponentFactory > xServiceManager = mxContext->getServiceManager(); - try - { - uno::Reference< frame::XDesktop > xDesktop (xServiceManager->createInstanceWithContext( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" )),mxContext ), uno::UNO_QUERY_THROW ); - xComponentEnumAccess = xDesktop->getComponents(); - } - catch(uno::Exception&) - { - } - - //rem look for the name of the document in the cmpoonents collection - uno::Reference < container::XEnumeration > xEnum = xComponentEnumAccess->createEnumeration(); - - // iterate through the collection by name - while (xEnum->hasMoreElements()) - { - // get the next element as a UNO Any - uno::Any aComponentHelper = xEnum->nextElement(); - uno::Reference <frame::XModel> xDocModel( aComponentHelper, uno::UNO_QUERY_THROW ); - - // get the name of the sheet from its XNamed interface - ::rtl::OUString aName = xDocModel->getURL(); - - - if (aName.match(MacroName.copy(0,Position_MacroSeparator-1),aName.lastIndexOf(sSeparator)+1)) - { - aMacroDocumentModel = xDocModel; - sMacro_only_Name = MacroName.copy(Position_MacroSeparator+1); - } - } - } - else + uno::Reference< frame::XModel > xModel; + SbMethod* pMeth = StarBASIC::GetActiveMethod(); + if ( pMeth ) { - aMacroDocumentModel = getCurrentDocument(); - sMacro_only_Name = MacroName.copy(0); + SbModule* pMod = dynamic_cast< SbModule* >( pMeth->GetParent() ); + if ( pMod ) + xModel = StarBASIC::GetModelFromBasic( pMod ); } - - MacroResolvedInfo aMacroInfo = resolveVBAMacro( getSfxObjShell( aMacroDocumentModel ), sMacro_only_Name ); + if ( !xModel.is() ) + xModel = getCurrentDocument(); + + MacroResolvedInfo aMacroInfo = resolveVBAMacro( getSfxObjShell( xModel ), aMacroName ); if( aMacroInfo.mbFound ) { // handle the arguments diff --git a/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx b/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx index 93679887ee..3176602dab 100644 --- a/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx +++ b/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx @@ -91,27 +91,33 @@ ScVbaCommandBarControl::setOnAction( const ::rtl::OUString& _onaction ) throw (u ::sal_Bool SAL_CALL ScVbaCommandBarControl::getVisible() throw (uno::RuntimeException) { - sal_Bool bVisible = sal_True; + /*sal_Bool bVisible = sal_True; uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible") ); if( aValue.hasValue() ) aValue >>= bVisible; - return bVisible; + return bVisible;*/ + return getEnabled(); + } void SAL_CALL ScVbaCommandBarControl::setVisible( ::sal_Bool _visible ) throw (uno::RuntimeException) { - uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible") ); + /*uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible") ); if( aValue.hasValue() ) { setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible"), uno::makeAny( _visible ) ); ApplyChange(); - } + }*/ + setEnabled( _visible); } ::sal_Bool SAL_CALL ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException) { sal_Bool bEnabled = sal_True; + rtl::OUString aCommandURLappendix = rtl::OUString::createFromAscii("___"); + rtl::OUString aCommandURL ; + if( m_xParentMenu.is() ) { // currently only the menu in the MenuBat support Enable/Disable @@ -121,7 +127,14 @@ ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException) else { // emulated with Visible - bEnabled = getVisible(); + //bEnabled = getVisible(); + uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL") ); + if (aValue >>= aCommandURL){ + if (0 == aCommandURL.indexOf(aCommandURLappendix)){ + bEnabled = sal_False; + } + } + } return bEnabled; } @@ -129,6 +142,9 @@ ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException) void SAL_CALL ScVbaCommandBarControl::setEnabled( sal_Bool _enabled ) throw (uno::RuntimeException) { + rtl::OUString aCommandURL ; + rtl::OUString aCommandURLappendix = rtl::OUString::createFromAscii("___"); + rtl::OUStringBuffer aCommandURLSringBuffer; if( m_xParentMenu.is() ) { // currently only the menu in the MenuBat support Enable/Disable @@ -136,8 +152,20 @@ ScVbaCommandBarControl::setEnabled( sal_Bool _enabled ) throw (uno::RuntimeExcep } else { + uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL") ); + if (aValue >>= aCommandURL){ + if (0 == aCommandURL.indexOf(aCommandURLappendix)){ + aCommandURL = aCommandURL.copy(3); + } + if (false == _enabled){ + aCommandURLSringBuffer = aCommandURLappendix; + } + aCommandURLSringBuffer.append(aCommandURL); + setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL"), uno::makeAny( aCommandURLSringBuffer.makeStringAndClear()) ); + ApplyChange(); + } // emulated with Visible - setVisible( _enabled ); + //setVisible( _enabled ); } } diff --git a/vbahelper/source/vbahelper/vbadocumentbase.cxx b/vbahelper/source/vbahelper/vbadocumentbase.cxx index 0eba699a07..caa2a37db2 100644 --- a/vbahelper/source/vbahelper/vbadocumentbase.cxx +++ b/vbahelper/source/vbahelper/vbadocumentbase.cxx @@ -28,14 +28,18 @@ #include "vbahelper/vbadocumentbase.hxx" #include "vbahelper/helperdecl.hxx" +#include <com/sun/star/lang/DisposedException.hpp> +#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp> #include <com/sun/star/util/XModifiable.hpp> #include <com/sun/star/util/XProtectable.hpp> #include <com/sun/star/util/XCloseable.hpp> +#include <com/sun/star/util/XURLTransformer.hpp> #include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/document/XEmbeddedScripts.hpp> //Michael E. Bohn #include <com/sun/star/beans/XPropertySet.hpp> +#include <cppuhelper/exc_hlp.hxx> #include <comphelper/unwrapargs.hxx> #include <tools/urlobj.hxx> #include <osl/file.hxx> @@ -74,7 +78,8 @@ VbaDocumentBase::getName() throw (uno::RuntimeException) uno::Reference< beans::XPropertySet > xProps( xFrame, uno::UNO_QUERY_THROW ); xProps->getPropertyValue(sTitle ) >>= sName; sal_Int32 pos = 0; - sName = sName.getToken(0,' ',pos); + sName = sName.getToken(0,'-',pos); + sName = sName.trim(); } return sName; } @@ -92,8 +97,8 @@ VbaDocumentBase::getPath() throw (uno::RuntimeException) ::rtl::OUString VbaDocumentBase::getFullName() throw (uno::RuntimeException) { - rtl::OUString sPath; - ::osl::File::getSystemPathFromFileURL( getModel()->getURL(), sPath ); + rtl::OUString sPath = getName(); + //::osl::File::getSystemPathFromFileURL( getModel()->getURL(), sPath ); return sPath; } @@ -127,23 +132,56 @@ VbaDocumentBase::Close( const uno::Any &rSaveArg, const uno::Any &rFileArg, else xModifiable->setModified( false ); - uno::Reference< util::XCloseable > xCloseable( getModel(), uno::UNO_QUERY ); - - if( xCloseable.is() ) - // use close(boolean DeliverOwnership) - - // The boolean parameter DeliverOwnership tells objects vetoing the close process that they may - // assume ownership if they object the closure by throwing a CloseVetoException - // Here we give up ownership. To be on the safe side, catch possible veto exception anyway. - xCloseable->close(sal_True); - // If close is not supported by this model - try to dispose it. - // But if the model disagree with a reset request for the modify state - // we shouldn't do so. Otherwhise some strange things can happen. - else + // first try to close the document using UI dispatch functionality + sal_Bool bUIClose = sal_False; + try + { + uno::Reference< frame::XController > xController( getModel()->getCurrentController(), uno::UNO_SET_THROW ); + uno::Reference< frame::XDispatchProvider > xDispatchProvider( xController->getFrame(), uno::UNO_QUERY_THROW ); + + uno::Reference< lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_SET_THROW ); + uno::Reference< util::XURLTransformer > xURLTransformer( + xServiceManager->createInstanceWithContext( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ) ), + mxContext ), + uno::UNO_QUERY_THROW ); + + util::URL aURL; + aURL.Complete = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CloseDoc" ) ); + xURLTransformer->parseStrict( aURL ); + + uno::Reference< css::frame::XDispatch > xDispatch( + xDispatchProvider->queryDispatch( aURL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_self" ) ), 0 ), + uno::UNO_SET_THROW ); + xDispatch->dispatch( aURL, uno::Sequence< beans::PropertyValue >() ); + bUIClose = sal_True; + } + catch( uno::Exception& ) + { + } + + if ( !bUIClose ) { - uno::Reference< lang::XComponent > xDisposable ( getModel(), uno::UNO_QUERY ); - if ( xDisposable.is() ) - xDisposable->dispose(); + // if it is not possible to use UI dispatch, try to close the model directly + uno::Reference< util::XCloseable > xCloseable( getModel(), uno::UNO_QUERY ); + if( xCloseable.is() ) + { + // use close(boolean DeliverOwnership) + + // The boolean parameter DeliverOwnership tells objects vetoing the close process that they may + // assume ownership if they object the closure by throwing a CloseVetoException + // Here we give up ownership. To be on the safe side, catch possible veto exception anyway. + xCloseable->close(sal_True); + } + else + { + // If close is not supported by this model - try to dispose it. + // But if the model disagree with a reset request for the modify state + // we shouldn't do so. Otherwhise some strange things can happen. + uno::Reference< lang::XComponent > xDisposable ( getModel(), uno::UNO_QUERY ); + if ( xDisposable.is() ) + xDisposable->dispose(); + } } } @@ -181,7 +219,22 @@ void VbaDocumentBase::setSaved( sal_Bool bSave ) throw (uno::RuntimeException) { uno::Reference< util::XModifiable > xModifiable( getModel(), uno::UNO_QUERY_THROW ); - xModifiable->setModified( !bSave ); + try + { + xModifiable->setModified( !bSave ); + } + catch ( lang::DisposedException& ) + { + // impossibility to set the modified state on disposed document should not trigger an error + } + catch ( beans::PropertyVetoException& ) + { + uno::Any aCaught( ::cppu::getCaughtException() ); + throw lang::WrappedTargetRuntimeException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can't change modified state of model!" ) ), + uno::Reference< uno::XInterface >(), + aCaught ); + } } sal_Bool @@ -213,7 +266,7 @@ VbaDocumentBase::getVBProject() throw (uno::RuntimeException) { uno::Sequence< uno::Any > aArgs( 2 ); aArgs[ 0 ] <<= uno::Reference< XHelperInterface >( this ); - aArgs[ 1 ] <<= mxModel; + aArgs[ 1 ] <<= getModel(); uno::Reference< lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_SET_THROW ); uno::Reference< uno::XInterface > xVBProjects = xServiceManager->createInstanceWithArgumentsAndContext( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBProject" ) ), aArgs, mxContext ); diff --git a/vbahelper/source/vbahelper/vbadocumentsbase.cxx b/vbahelper/source/vbahelper/vbadocumentsbase.cxx index 61cdb52ca3..911cfdef40 100644 --- a/vbahelper/source/vbahelper/vbadocumentsbase.cxx +++ b/vbahelper/source/vbahelper/vbadocumentsbase.cxx @@ -25,6 +25,7 @@ * ************************************************************************/ #include <vbahelper/vbadocumentsbase.hxx> +#include <comphelper/mediadescriptor.hxx> #include <comphelper/processfactory.hxx> #include <cppuhelper/implbase1.hxx> #include <cppuhelper/implbase3.hxx> @@ -212,10 +213,9 @@ VbaDocumentsBase::VbaDocumentsBase( const uno::Reference< XHelperInterface >& xP { } -uno::Any SAL_CALL -VbaDocumentsBase::Add() throw (uno::RuntimeException) +uno::Any VbaDocumentsBase::createDocument() throw (uno::RuntimeException) { - uno::Reference< lang::XMultiComponentFactory > xSMgr( + uno::Reference< lang::XMultiComponentFactory > xSMgr( mxContext->getServiceManager(), uno::UNO_QUERY_THROW ); uno::Reference< frame::XComponentLoader > xLoader( @@ -229,15 +229,21 @@ VbaDocumentsBase::Add() throw (uno::RuntimeException) sURL = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("private:factory/scalc") ); else throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Not implemented") ), uno::Reference< uno::XInterface >() ); + + // prepare the media descriptor + ::comphelper::MediaDescriptor aMediaDesc; + aMediaDesc[ ::comphelper::MediaDescriptor::PROP_MACROEXECUTIONMODE() ] <<= document::MacroExecMode::USE_CONFIG; + aMediaDesc.setComponentDataEntry( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ApplyFormDesignMode" ) ), uno::Any( false ) ); + + // craete the new document uno::Reference< lang::XComponent > xComponent = xLoader->loadComponentFromURL( sURL , - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("_blank") ), 0, - uno::Sequence< beans::PropertyValue >(0) ); + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("_blank") ), 0, + aMediaDesc.getAsConstPropertyValueList() ); return uno::makeAny( xComponent ); } -void -VbaDocumentsBase::Close() throw (uno::RuntimeException) +void VbaDocumentsBase::closeDocuments() throw (uno::RuntimeException) { // #FIXME this *MUST* be wrong documents::close surely closes ALL documents // in the collection, use of getCurrentDocument here is totally wrong @@ -251,8 +257,7 @@ VbaDocumentsBase::Close() throw (uno::RuntimeException) } // #TODO# #FIXME# can any of the unused params below be used? -uno::Any -VbaDocumentsBase::Open( const rtl::OUString& rFileName, const uno::Any& ReadOnly, const uno::Sequence< beans::PropertyValue >& rProps ) throw (uno::RuntimeException) +uno::Any VbaDocumentsBase::openDocument( const rtl::OUString& rFileName, const uno::Any& ReadOnly, const uno::Sequence< beans::PropertyValue >& rProps ) throw (uno::RuntimeException) { // we need to detect if this is a URL, if not then assume its a file path rtl::OUString aURL; diff --git a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx index f81245207b..86ae20a735 100755 --- a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx +++ b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx @@ -74,10 +74,6 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un EventQueue aEventQueue; aEventQueue.push_back( EventQueueEntry( nEventId, rArgs ) ); - /* bEnabled will track if event processing is enabled. Every event handler - may disable handling of other events. */ - bool bEnabled = true; - /* bCancel will contain the current Cancel value. It is possible that multiple events will try to modify the Cancel value. Every event handler receives the Cancel value of the previous event handler. */ @@ -87,10 +83,10 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un executed successfully. */ bool bSuccess = false; - /* Loop as long as there are more events to be processed, and as event - handling is still enabled. Derived classes may add new events to be - processed in the virtual implPrepareEvent() function. */ - while( bEnabled && !aEventQueue.empty() ) + /* Loop as long as there are more events to be processed. Derived classes + may add new events to be processed in the virtual implPrepareEvent() + function. */ + while( !aEventQueue.empty() ) { /* Check that all class members are available, and that we are not disposed (this may have happened at any time during execution of @@ -103,14 +99,14 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un uno::Sequence< uno::Any > aEventArgs = aEventQueue.front().maArgs; aEventQueue.pop_front(); - // let derived classes decide whether event processing is still enabled - bEnabled = implEventsEnabled(); - // let derived classes prepare the event, they may add new events for next iteration - if( bEnabled && implPrepareEvent( aEventQueue, rInfo, aEventArgs ) ) + /* Let derived classes prepare the event, they may add new events for + next iteration. If false is returned, the event handler must not be + called. */ + bool bEventSuccess = false; + if( implPrepareEvent( aEventQueue, rInfo, aEventArgs ) ) { // search the event handler macro in the document ::rtl::OUString aMacroPath = getEventHandlerPath( rInfo, aEventArgs ); - bool bEventSuccess = false; if( aMacroPath.getLength() > 0 ) { // build the argument list @@ -139,11 +135,11 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un bCancel = nNewCancel != 0; } } - // post processing (also, if event handler does not exist, or on error - implPostProcessEvent( aEventQueue, rInfo, bEventSuccess, bCancel ); // global success, if at least one event handler succeeded bSuccess |= bEventSuccess; } + // post processing (also, if event handler does not exist, or disabled, or on error + implPostProcessEvent( aEventQueue, rInfo, bEventSuccess, bCancel ); } // if event handlers want to cancel the event, do so regardless of any errors @@ -200,7 +196,8 @@ const VbaEventsHelperBase::EventHandlerInfo& VbaEventsHelperBase::getEventHandle append( sal_Unicode( '.' ) ).append( rInfo.maMacroName ).makeStringAndClear(); break; } - return resolveVBAMacro( mpShell, aMacroName ).msResolvedMacro; + MacroResolvedInfo aMacroInfo = resolveVBAMacro( mpShell, aMacroName, false ); + return aMacroInfo.mbFound ? ::rtl::OUString( aMacroInfo.msResolvedMacro ) : ::rtl::OUString(); } void VbaEventsHelperBase::stopListening() diff --git a/vbahelper/source/vbahelper/vbahelper.cxx b/vbahelper/source/vbahelper/vbahelper.cxx index cf1981fa8f..542667b37e 100644 --- a/vbahelper/source/vbahelper/vbahelper.cxx +++ b/vbahelper/source/vbahelper/vbahelper.cxx @@ -39,6 +39,9 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/beans/XIntrospection.hpp> #include <com/sun/star/util/MeasureUnit.hpp> +#include <com/sun/star/awt/XWindow.hpp> +#include <com/sun/star/awt/XDialog.hpp> +#include <com/sun/star/awt/PosSize.hpp> #include <ooo/vba/msforms/XShape.hpp> @@ -989,277 +992,122 @@ sal_Bool setPropertyValue( uno::Sequence< beans::PropertyValue >& aProp, const r // ====UserFormGeomentryHelper==== //--------------------------------------------- UserFormGeometryHelper::UserFormGeometryHelper( const uno::Reference< uno::XComponentContext >& /*xContext*/, const uno::Reference< awt::XControl >& xControl ) +: mbDialog( uno::Reference< awt::XDialog >( xControl, uno::UNO_QUERY ).is() ) { if ( !xControl.is() ) - throw uno::RuntimeException(); - - mxControlUnits.set( xControl->getPeer(), uno::UNO_QUERY_THROW ); - mxModel.set( xControl->getModel(), uno::UNO_QUERY_THROW ); -} - -//--------------------------------------------- -sal_Int32 UserFormGeometryHelper::ConvertPixelToLogic( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nTargetUnit ) -{ - sal_Int32 nResult = 0; - if ( bIsPoint ) - { - // conversion for a point - awt::Point aPixelPoint( 0, 0 ); - ( bIsX ? aPixelPoint.X : aPixelPoint.Y ) = nValue; - awt::Point aTargetPoint( 0, 0 ); - aTargetPoint = mxControlUnits->convertPointToLogic( aPixelPoint, nTargetUnit ); - - nResult = bIsX ? aTargetPoint.X : aTargetPoint.Y; - } - else - { - // conversion for a size - awt::Size aPixelSize( 0, 0 ); - ( bIsX ? aPixelSize.Width : aPixelSize.Height ) = nValue; - awt::Size aTargetSize( 0, 0 ); - aTargetSize = mxControlUnits->convertSizeToLogic( aPixelSize, nTargetUnit ); - - nResult = bIsX ? aTargetSize.Width : aTargetSize.Height; - } + throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No control is provided!" ) ), + uno::Reference< uno::XInterface >() ); - return nResult; + mxWindow.set( xControl->getPeer(), uno::UNO_QUERY_THROW ); } //--------------------------------------------- -sal_Int32 UserFormGeometryHelper::ConvertLogicToPixel( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nSourceUnit ) -{ - sal_Int32 nResult = 0; - if ( bIsPoint ) - { - // conversion for a point - awt::Point aSourcePoint( 0, 0 ); - ( bIsX ? aSourcePoint.X : aSourcePoint.Y ) = nValue; - - awt::Point aPixelPoint( 0, 0 ); - aPixelPoint = mxControlUnits->convertPointToPixel( aSourcePoint, nSourceUnit ); - - nResult = bIsX ? aPixelPoint.X : aPixelPoint.Y; - } - else - { - // conversion for a size - awt::Size aSourceSize( 0, 0 ); - ( bIsX ? aSourceSize.Width : aSourceSize.Height ) = nValue; - - awt::Size aPixelSize( 0, 0 ); - aPixelSize = mxControlUnits->convertSizeToPixel( aSourceSize, nSourceUnit ); - - nResult = bIsX ? aPixelSize.Width : aPixelSize.Height; - } - - return nResult; -} -//--------------------------------------------- double UserFormGeometryHelper::getLeft() { - double nResult = 0; - - try - { - sal_Int32 nLeft = 0; - mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_LEFT ) ) ) >>= nLeft; - nResult = ConvertLogicToPixel( nLeft, - sal_True, // Point - sal_True, // X - util::MeasureUnit::APPFONT ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) - { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get position X!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); - } - - return nResult; + return mxWindow->getPosSize().X; } //--------------------------------------------- void UserFormGeometryHelper::setLeft( double nLeft ) { - try - { - mxModel->setPropertyValue( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_LEFT ) ), - uno::makeAny( ConvertPixelToLogic( nLeft, - sal_True, // Point - sal_True, // X - util::MeasureUnit::APPFONT ) ) ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) - { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set position X!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); - } + mxWindow->setPosSize( nLeft, mxWindow->getPosSize().Y, 0, 0, awt::PosSize::POS ); } //--------------------------------------------- double UserFormGeometryHelper::getTop() { - double nResult = 0; - - try - { - sal_Int32 nTop = 0; - mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_TOP ) ) ) >>= nTop; - nResult = ConvertLogicToPixel( nTop, - sal_True, // Point - sal_False, // Y - util::MeasureUnit::APPFONT ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) - { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get position Y!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); - } - - return nResult; + return mxWindow->getPosSize().Y; } //--------------------------------------------- void UserFormGeometryHelper::setTop( double nTop ) { - try - { - mxModel->setPropertyValue( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_TOP ) ), - uno::makeAny( ConvertPixelToLogic( nTop, - sal_True, // Point - sal_False, // Y - util::MeasureUnit::APPFONT ) ) ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) - { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set position X!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); - } + mxWindow->setPosSize( mxWindow->getPosSize().X, nTop, 0, 0, awt::PosSize::POS ); } //--------------------------------------------- double UserFormGeometryHelper::getWidth() { - double nResult = 0; - - try + if ( mbDialog ) { - sal_Int32 nWidth = 0; - mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_WIDTH ) ) ) >>= nWidth; - nResult = ConvertLogicToPixel( nWidth, - sal_False, // Size - sal_True, // X - util::MeasureUnit::APPFONT ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) - { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get width!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); + const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ); + if ( pWindow ) + { + // get the size with decoration + Rectangle aResult = pWindow->GetWindowExtentsRelative( NULL ); + return aResult.getWidth(); + } } - return nResult; + return mxWindow->getPosSize().Width; } //--------------------------------------------- -void UserFormGeometryHelper::setWidth( double nWidth) +void UserFormGeometryHelper::setWidth( double nWidth ) { - try - { - mxModel->setPropertyValue( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_WIDTH ) ), - uno::makeAny( ConvertPixelToLogic( nWidth, - sal_False, // Size - sal_True, // X - util::MeasureUnit::APPFONT ) ) ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) + sal_Int64 nNewWidth = nWidth; + + if ( mbDialog ) { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set width!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); + const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ); + if ( pWindow ) + { + // set the size with decoration + Rectangle aRDecor = pWindow->GetWindowExtentsRelative( NULL ); + if ( !aRDecor.IsEmpty() ) + { + sal_Int64 nDecor = aRDecor.getWidth(); + sal_Int64 nUnDecor = mxWindow->getPosSize().Width; + if ( nWidth < nDecor - nUnDecor ) + nUnDecor = nDecor - nWidth; // avoid negative size + nNewWidth = nWidth + nUnDecor - nDecor; + } + } } + + mxWindow->setPosSize( 0, 0, nNewWidth, 0, awt::PosSize::WIDTH ); } //--------------------------------------------- double UserFormGeometryHelper::getHeight() { - double nResult = 0; - - try + if ( mbDialog ) { - sal_Int32 nHeight = 0; - mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_HEIGHT ) ) ) >>= nHeight; - nResult = ConvertLogicToPixel( nHeight, - sal_False, // Size - sal_False, // Y - util::MeasureUnit::APPFONT ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) - { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get height!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); + const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ); + if ( pWindow ) + { + // get the size with decoration + Rectangle aResult = pWindow->GetWindowExtentsRelative( NULL ); + return aResult.getHeight(); + } } - return nResult; + return mxWindow->getPosSize().Height; } //--------------------------------------------- void UserFormGeometryHelper::setHeight( double nHeight ) { - try - { - mxModel->setPropertyValue( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_HEIGHT ) ), - uno::makeAny( ConvertPixelToLogic( nHeight, - sal_False, // Size - sal_False, // Y - util::MeasureUnit::APPFONT ) ) ); - } - catch ( uno::RuntimeException& ) - { - throw; - } - catch ( uno::Exception& e ) + sal_Int64 nNewHeight = nHeight; + if ( mbDialog ) { - throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set height!" ) ), - uno::Reference< uno::XInterface >(), - uno::makeAny( e ) ); + const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow ); + if ( pWindow ) + { + // set the size with decoration + Rectangle aRDecor = pWindow->GetWindowExtentsRelative( NULL ); + if ( !aRDecor.IsEmpty() ) + { + sal_Int64 nDecor = aRDecor.getHeight(); + sal_Int64 nUnDecor = mxWindow->getPosSize().Height; + if ( nHeight < nDecor - nUnDecor ) + nUnDecor = nDecor - nHeight; // avoid negative size + nNewHeight = nHeight + nUnDecor - nDecor; + } + } } + + mxWindow->setPosSize( 0, 0, 0, nNewHeight, awt::PosSize::HEIGHT ); } // ============ |