diff options
-rw-r--r-- | include/oox/ole/vbaproject.hxx | 11 | ||||
-rw-r--r-- | oox/source/ole/axcontrol.cxx | 10 | ||||
-rw-r--r-- | oox/source/ole/vbaproject.cxx | 79 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookfragment.cxx | 23 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookhelper.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/unoobj/servuno.cxx | 2 |
6 files changed, 80 insertions, 47 deletions
diff --git a/include/oox/ole/vbaproject.hxx b/include/oox/ole/vbaproject.hxx index f742138756b5..55ac3a8b280a 100644 --- a/include/oox/ole/vbaproject.hxx +++ b/include/oox/ole/vbaproject.hxx @@ -25,6 +25,7 @@ #include "oox/helper/refvector.hxx" #include "oox/helper/storagebase.hxx" #include "oox/dllapi.h" +#include "oox/ole/vbamodule.hxx" namespace com { namespace sun { namespace star { namespace container { class XNameContainer; } @@ -126,7 +127,12 @@ public: bool importVbaProject( StorageBase& rVbaPrjStrg ); - /** Registers a macro atatcher object. For details, see description of the + /** Reads vba module related information from the project streams */ + void readVbaModules( StorageBase& rVbaPrjStrg ); + /** Imports (and creates) vba modules and user forms from the vba project records previously read. + Note: ( expects that readVbaModules was already called ) */ + void importModulesAndForms( StorageBase& rVbaPrjStrg, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr = true ); + /** Registers a macro attacher object. For details, see description of the VbaMacroAttacherBase class. */ void registerMacroAttacher( const VbaMacroAttacherRef& rxAttacher ); @@ -194,6 +200,9 @@ private: OUString maPrjName; ///< Name of the VBA project. ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > mxOleOverridesSink; + typedef RefMap< rtl::OUString, VbaModule > VbaModuleMap; + VbaModuleMap maModules; + VbaModuleMap maModulesByStrm; }; // ============================================================================ diff --git a/oox/source/ole/axcontrol.cxx b/oox/source/ole/axcontrol.cxx index d5303a4eea7e..23f08e37bd4a 100644 --- a/oox/source/ole/axcontrol.cxx +++ b/oox/source/ole/axcontrol.cxx @@ -2704,6 +2704,7 @@ EmbeddedForm::EmbeddedForm( const Reference< XModel >& rxDocModel, Reference< XControlModel > EmbeddedForm::convertAndInsert( const EmbeddedControl& rControl, sal_Int32& rnCtrlIndex ) { + Reference< XControlModel > xRet; if( mxModelFactory.is() && rControl.hasModel() ) try { // create the UNO control model @@ -2711,20 +2712,19 @@ Reference< XControlModel > EmbeddedForm::convertAndInsert( const EmbeddedControl Reference< XFormComponent > xFormComp( mxModelFactory->createInstance( aServiceName ), UNO_QUERY_THROW ); Reference< XControlModel > xCtrlModel( xFormComp, UNO_QUERY_THROW ); + // convert the control properties + if( rControl.convertProperties( xCtrlModel, maControlConv ) ) + xRet = xCtrlModel; // insert the control into the form Reference< XIndexContainer > xFormIC( createXForm(), UNO_SET_THROW ); rnCtrlIndex = xFormIC->getCount(); xFormIC->insertByIndex( rnCtrlIndex, Any( xFormComp ) ); - - // convert the control properties - if( rControl.convertProperties( xCtrlModel, maControlConv ) ) - return xCtrlModel; } catch (const Exception& e) { SAL_WARN("oox", "exception creating Control: " << e.Message); } - return Reference< XControlModel >(); + return xRet; } Reference< XIndexContainer > EmbeddedForm::createXForm() diff --git a/oox/source/ole/vbaproject.cxx b/oox/source/ole/vbaproject.cxx index 91be35621d3d..b58710d0efcc 100644 --- a/oox/source/ole/vbaproject.cxx +++ b/oox/source/ole/vbaproject.cxx @@ -264,8 +264,14 @@ Reference< XNameContainer > VbaProject::createDialogLibrary() void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) { + readVbaModules( rVbaPrjStrg ); + importModulesAndForms(rVbaPrjStrg, rGraphicHelper, bDefaultColorBgr ); +} + +void VbaProject::readVbaModules( StorageBase& rVbaPrjStrg ) +{ StorageRef xVbaStrg = rVbaPrjStrg.openSubStorage( "VBA", false ); - OSL_ENSURE( xVbaStrg.get(), "VbaProject::importVba - cannot open 'VBA' substorage" ); + OSL_ENSURE( xVbaStrg.get(), "VbaProject::readVbaModules - cannot open 'VBA' substorage" ); if( !xVbaStrg ) return; @@ -288,8 +294,6 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap sal_uInt16 nModuleCount = 0; bool bExecutable = isImportVbaExecutable(); - typedef RefMap< OUString, VbaModule > VbaModuleMap; - VbaModuleMap aModules, aModulesByStrm; sal_uInt16 nRecId = 0; StreamDataSequence aRecData; @@ -304,7 +308,7 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap case VBA_ID_PROJECTCODEPAGE: { OOX_ENSURE_RECORDSIZE( nRecSize == 2 ); - OSL_ENSURE( aModules.empty(), "VbaProject::importVba - unexpected PROJECTCODEPAGE record" ); + OSL_ENSURE( maModules.empty(), "VbaProject::importVba - unexpected PROJECTCODEPAGE record" ); rtl_TextEncoding eNewTextEnc = rtl_getTextEncodingFromWindowsCodePage( aRecStrm.readuInt16() ); OSL_ENSURE( eNewTextEnc != RTL_TEXTENCODING_DONTKNOW, "VbaProject::importVba - unknown text encoding" ); if( eNewTextEnc != RTL_TEXTENCODING_DONTKNOW ) @@ -321,26 +325,26 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap break; case VBA_ID_PROJECTMODULES: OOX_ENSURE_RECORDSIZE( nRecSize == 2 ); - OSL_ENSURE( aModules.empty(), "VbaProject::importVba - unexpected PROJECTMODULES record" ); + OSL_ENSURE( maModules.empty(), "VbaProject::importVba - unexpected PROJECTMODULES record" ); aRecStrm >> nModuleCount; break; case VBA_ID_MODULENAME: { OUString aName = aRecStrm.readCharArrayUC( nRecSize, eTextEnc ); OSL_ENSURE( !aName.isEmpty(), "VbaProject::importVba - invalid module name" ); - OSL_ENSURE( !aModules.has( aName ), "VbaProject::importVba - multiple modules with the same name" ); - VbaModuleMap::mapped_type& rxModule = aModules[ aName ]; + OSL_ENSURE( !maModules.has( aName ), "VbaProject::importVba - multiple modules with the same name" ); + VbaModuleMap::mapped_type& rxModule = maModules[ aName ]; rxModule.reset( new VbaModule( mxContext, mxDocModel, aName, eTextEnc, bExecutable ) ); // read all remaining records until the MODULEEND record rxModule->importDirRecords( aDirStrm ); - OSL_ENSURE( !aModulesByStrm.has( rxModule->getStreamName() ), "VbaProject::importVba - multiple modules with the same stream name" ); - aModulesByStrm[ rxModule->getStreamName() ] = rxModule; + OSL_ENSURE( !maModulesByStrm.has( rxModule->getStreamName() ), "VbaProject::importVba - multiple modules with the same stream name" ); + maModulesByStrm[ rxModule->getStreamName() ] = rxModule; } break; #undef OOX_ENSURE_RECORDSIZE } } - OSL_ENSURE( nModuleCount == aModules.size(), "VbaProject::importVba - invalid module count" ); + OSL_ENSURE( nModuleCount == maModules.size(), "VbaProject::importVba - invalid module count" ); /* The directory does not contain the real type of the modules, it distinguishes only between 'procedural' and 'document' (the latter @@ -397,19 +401,48 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap if( (nType != ModuleType::UNKNOWN) && !aValue.isEmpty() ) { - OSL_ENSURE( aModules.has( aValue ), "VbaProject::importVba - module not found" ); - if( VbaModule* pModule = aModules.get( aValue ).get() ) + OSL_ENSURE( maModules.has( aValue ), "VbaProject::importVba - module not found" ); + if( VbaModule* pModule = maModules.get( aValue ).get() ) pModule->setType( nType ); } } } } + if( !maModules.empty() ) try + { + /* Set library container to VBA compatibility mode. This will create + the VBA Globals object and store it in the Basic manager of the + document. */ + try + { + Reference< XVBACompatibility > xVBACompat( getLibraryContainer( PROP_BasicLibraries ), UNO_QUERY_THROW ); + xVBACompat->setVBACompatibilityMode( sal_True ); + xVBACompat->setProjectName( maPrjName ); + + } + catch(const Exception& ) + { + } + } + catch(const Exception& ) + { + } +} + +void VbaProject::importModulesAndForms( StorageBase& rVbaPrjStrg, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) +{ + StorageRef xVbaStrg = rVbaPrjStrg.openSubStorage( "VBA", false ); + OSL_ENSURE( xVbaStrg.get(), "VbaProject::importModulesAndForms - cannot open 'VBA' substorage" ); + if( !xVbaStrg ) + return; + rtl_TextEncoding eTextEnc = RTL_TEXTENCODING_MS_1252; + bool bExecutable = isImportVbaExecutable(); // create empty dummy modules VbaModuleMap aDummyModules; for( DummyModuleMap::iterator aIt = maDummyModules.begin(), aEnd = maDummyModules.end(); aIt != aEnd; ++aIt ) { - OSL_ENSURE( !aModules.has( aIt->first ) && !aDummyModules.has( aIt->first ), "VbaProject::importVba - multiple modules with the same name" ); + OSL_ENSURE( !maModules.has( aIt->first ) && !aDummyModules.has( aIt->first ), "VbaProject::importVba - multiple modules with the same name" ); VbaModuleMap::mapped_type& rxModule = aDummyModules[ aIt->first ]; rxModule.reset( new VbaModule( mxContext, mxDocModel, aIt->first, eTextEnc, bExecutable ) ); rxModule->setType( aIt->second ); @@ -419,26 +452,12 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap into the Basic library of the document specified by the 'maPrjName' member. Do not create the Basic library, if there are no modules specified. */ - if( !aModules.empty() || !aDummyModules.empty() ) try + if( !maModules.empty() || !aDummyModules.empty() ) try { // get the model factory and the basic library Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW ); Reference< XNameContainer > xBasicLib( createBasicLibrary(), UNO_SET_THROW ); - /* Set library container to VBA compatibility mode. This will create - the VBA Globals object and store it in the Basic manager of the - document. */ - try - { - Reference< XVBACompatibility > xVBACompat( getLibraryContainer( PROP_BasicLibraries ), UNO_QUERY_THROW ); - xVBACompat->setVBACompatibilityMode( sal_True ); - xVBACompat->setProjectName( maPrjName ); - - } - catch(const Exception& ) - { - } - // try to get access to document objects related to code modules Reference< XNameAccess > xDocObjectNA; try @@ -454,7 +473,7 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap { // #TODO cater for mxOleOverridesSink, like I used to before // call Basic source code import for each module, boost::[c]ref enforces pass-by-ref - aModules.forEachMem( &VbaModule::createAndImportModule, + maModules.forEachMem( &VbaModule::createAndImportModule, ::boost::ref( *xVbaStrg ), ::boost::cref( xBasicLib ), ::boost::cref( xDocObjectNA ) ); @@ -482,7 +501,7 @@ void VbaProject::importVba( StorageBase& rVbaPrjStrg, const GraphicHelper& rGrap if( xSubStrg.get() ) try { // resolve module name from storage name (which equals the module stream name) - VbaModule* pModule = aModulesByStrm.get( *aIt ).get(); + VbaModule* pModule = maModulesByStrm.get( *aIt ).get(); OSL_ENSURE( pModule && (pModule->getType() == ModuleType::FORM), "VbaProject::importVba - form substorage without form module" ); OUString aModuleName; diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx index 5fad0fd6af25..6907d93d4b50 100644 --- a/sc/source/filter/oox/workbookfragment.cxx +++ b/sc/source/filter/oox/workbookfragment.cxx @@ -51,6 +51,7 @@ #include <comphelper/processfactory.hxx> #include <officecfg/Office/Calc.hxx> +#include "oox/ole/vbaproject.hxx" namespace oox { namespace xls { @@ -299,6 +300,19 @@ void WorkbookFragment::finalizeImport() // create all defined names and database ranges getDefinedNames().finalizeImport(); getTables().finalizeImport(); + // open the VBA project storage + OUString aVbaFragmentPath = getFragmentPathFromFirstType( CREATE_MSOFFICE_RELATION_TYPE( "vbaProject" ) ); + if( !aVbaFragmentPath.isEmpty() ) + { + Reference< XInputStream > xInStrm = getBaseFilter().openInputStream( aVbaFragmentPath ); + if( xInStrm.is() ) + { + StorageRef xPrjStrg( new ::oox::ole::OleStorage( getBaseFilter().getComponentContext(), xInStrm, false ) ); + setVbaProjectStorage( xPrjStrg ); + getBaseFilter().getVbaProject().readVbaModules( *xPrjStrg ); + } + } + // load all worksheets for( SheetFragmentVector::iterator aIt = aSheetFragments.begin(), aEnd = aSheetFragments.end(); aIt != aEnd; ++aIt ) { @@ -318,15 +332,6 @@ void WorkbookFragment::finalizeImport() aIt->first.reset(); } - // open the VBA project storage - OUString aVbaFragmentPath = getFragmentPathFromFirstType( CREATE_MSOFFICE_RELATION_TYPE( "vbaProject" ) ); - if( !aVbaFragmentPath.isEmpty() ) - { - Reference< XInputStream > xInStrm = getBaseFilter().openInputStream( aVbaFragmentPath ); - if( xInStrm.is() ) - setVbaProjectStorage( StorageRef( new ::oox::ole::OleStorage( getBaseFilter().getComponentContext(), xInStrm, false ) ) ); - } - // final conversions, e.g. calculation settings and view settings finalizeWorkbookImport(); diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index 51fd4266aafc..5e9b39f16d1c 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -710,7 +710,7 @@ void WorkbookHelper::finalizeWorkbookImport() contains the workbook code name). */ StorageRef xVbaPrjStrg = mrBookGlob.getVbaProjectStorage(); if( xVbaPrjStrg.get() && xVbaPrjStrg->isStorage() ) - getBaseFilter().getVbaProject().importVbaProject( *xVbaPrjStrg, getBaseFilter().getGraphicHelper() ); + getBaseFilter().getVbaProject().importModulesAndForms( *xVbaPrjStrg, getBaseFilter().getGraphicHelper() ); } // document model ------------------------------------------------------------- diff --git a/sc/source/ui/unoobj/servuno.cxx b/sc/source/ui/unoobj/servuno.cxx index e36f967fd447..3938908e36c5 100644 --- a/sc/source/ui/unoobj/servuno.cxx +++ b/sc/source/ui/unoobj/servuno.cxx @@ -618,7 +618,7 @@ uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance( } break; case SC_SERVICE_VBACODENAMEPROVIDER: - if ( pDocShell && ooo::vba::isAlienExcelDoc( *pDocShell ) && isInVBAMode( *pDocShell ) ) + if ( pDocShell && isInVBAMode( *pDocShell ) ) { OSL_TRACE("**** creating VBA Object provider"); xRet.set(static_cast<document::XCodeNameQuery*>(new ScVbaCodeNameProvider(*pDocShell))); |