[ooo-build-commit] 2 commits - patches/vba

Noel Power noelp at kemper.freedesktop.org
Tue Aug 11 06:42:01 PDT 2009


 patches/vba/vba-transient-imported-autotext.diff |  543 +++++++++++++++++++++++
 1 file changed, 543 insertions(+)

New commits:
commit 2ef2699d5b6cbec59bc7a6a523aaadca0ac67500
Author: Noel Power <noel.power at novell.com>
Date:   Tue Aug 11 14:41:08 2009 +0100

    moved patch to vba dir ( also removed testing related hunk )
    
    * patches/vba-transient-imported-autotext.diff:
    * patches/vba/vba-transient-imported-autotext.diff:

diff --git a/patches/vba-transient-imported-autotext.diff b/patches/vba-transient-imported-autotext.diff
deleted file mode 100644
index 19e5c64..0000000
--- a/patches/vba-transient-imported-autotext.diff
+++ /dev/null
@@ -1,557 +0,0 @@
-diff --git sw/inc/docsh.hxx sw/inc/docsh.hxx
-index 9d76217..ac2fb3e 100644
---- sw/inc/docsh.hxx
-+++ sw/inc/docsh.hxx
-@@ -32,6 +32,7 @@
- 
- #include <rtl/ref.hxx>
- #include <com/sun/star/frame/XController.hpp>
-+#include <com/sun/star/container/XNamed.hpp>
- #include <vcl/timer.hxx>
- #include <sfx2/docfac.hxx>
- #include <sfx2/objsh.hxx>
-@@ -62,6 +63,12 @@ class IDocumentSettingAccess;
- class IDocumentTimerAccess;
- class IDocumentChartDataProviderAccess;
- 
-+class SW_DLLPUBLIC SwImportedAutoText
-+{
-+    std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > > mImportedAutotext;    
-+public:
-+    ::com::sun::star::uno::Reference<   ::com::sun::star::container::XNamed > ImportAutoText( const String& TemplateURL );
-+};
- 
- class SW_DLLPUBLIC SwDocShell: public SfxObjectShell, public SfxListener
- {
-@@ -86,6 +93,7 @@ class SW_DLLPUBLIC SwDocShell: public SfxObjectShell, public SfxListener
-     sal_Int16               nUpdateDocMode; // contains the com::sun::star::document::UpdateDocMode
-     bool                    bInUpdateFontList; //prevent nested calls of UpdateFontList
-     bool                    bIsATemplate; //prevent nested calls of UpdateFontList
-+    SwImportedAutoText mImportedAutoText;
-     // Methoden fuer den Zugriff aufs Doc
-     SW_DLLPRIVATE void					AddLink();
-     SW_DLLPRIVATE void					RemoveLink();
-@@ -302,6 +310,7 @@ public:
-     SfxInPlaceClient* GetIPClient( const ::svt::EmbeddedObjectRef& xObjRef );
-     SW_DLLPRIVATE sal_Bool IsTemplate() { return bIsATemplate; }
-     SW_DLLPRIVATE void SetIsTemplate( bool bValue ) { bIsATemplate = bValue; }
-+    SwImportedAutoText& AutoTextImporter(){ return mImportedAutoText; }
- };
- 
- class Graphic;
-diff --git sw/inc/unoatxt.hxx sw/inc/unoatxt.hxx
-index e54d4b0..a152f56 100644
---- sw/inc/unoatxt.hxx
-+++ sw/inc/unoatxt.hxx
-@@ -75,9 +75,9 @@ class SwXAutoTextContainer : public cppu::WeakImplHelper3
-     ::com::sun::star::container::XIndexAccess
- >
- {
--    SwGlossaries *pGlossaries;
- 
- protected:
-+    SwGlossaries *pGlossaries;
-     virtual ~SwXAutoTextContainer();	// ref-counted objects are not to be deleted from outside -> protected dtor
- 
- public:
-diff --git sw/source/core/swg/SwXMLTextBlocks.cxx sw/source/core/swg/SwXMLTextBlocks.cxx
-index 15e91e7..0386378 100644
---- sw/source/core/swg/SwXMLTextBlocks.cxx
-+++ sw/source/core/swg/SwXMLTextBlocks.cxx
-@@ -92,6 +92,7 @@ SwXMLTextBlocks::SwXMLTextBlocks( const String& rFile )
-     try
-     {
-         refStg  = comphelper::OStorageHelper::GetStorageFromURL( rFile, embed::ElementModes::READWRITE );
-+	Touch(); // update creation & modification times ( on slow systems IsFileChanged can fail )
-         bReadOnly = FALSE;
-     }
-     catch( const uno::Exception& )
-diff --git sw/source/filter/ww8/ww8par.cxx sw/source/filter/ww8/ww8par.cxx
-index febac10..fdd7a97 100644
---- sw/source/filter/ww8/ww8par.cxx
-+++ sw/source/filter/ww8/ww8par.cxx
-@@ -4227,6 +4227,9 @@ ULONG SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos)
- 
-             // Read Global templates 
-             ReadGlobalTemplateSettings( sCreatedFrom, xPrjNameCache );
-+            rtl::OUString sAttachedTemplate = rtl::OUString::createFromAscii("file:///data4/home/npower/swedish-police-mallar/Word/rp_ansta.dot");
-+            mpDocShell->AutoTextImporter().ImportAutoText( sAttachedTemplate );
-+
- #endif 
-             // Create and insert Word vba Globals
-             uno::Any aGlobs;
-diff --git sw/source/ui/app/docsh.cxx sw/source/ui/app/docsh.cxx
-index dd2f32d..87553e4 100644
---- sw/source/ui/app/docsh.cxx
-+++ sw/source/ui/app/docsh.cxx
-@@ -162,6 +162,7 @@
- #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
- 
- #include <unomid.h>
-+#include "glosdoc.hxx"
- 
- using rtl::OUString;
- using namespace ::com::sun::star;
-@@ -169,6 +170,32 @@ using namespace ::com::sun::star::uno;
- using namespace ::com::sun::star::script;
- using namespace ::com::sun::star::container;
- 
-+uno::Reference< container::XNamed >
-+SwImportedAutoText::ImportAutoText( const String& sTemplateURL )
-+{
-+    uno::Reference< container::XNamed > xResult;
-+    // see if we already have imported this template
-+    std::vector< uno::Reference< container::XNamed > >::iterator it_end = mImportedAutotext.end();
-+    rtl::OUString sGroupName = SwTransientGlossaries::GetTransientImportedGlossaries().GetGroupName( sTemplateURL );
-+
-+    for ( std::vector< uno::Reference< container::XNamed > >::iterator it = mImportedAutotext.begin(); it != it_end; ++it )
-+    {
-+        if ( (*it)->getName().equals( sGroupName ) )
-+        {
-+            xResult = (*it);
-+            break; 
-+        } 
-+    }
-+    if ( !xResult.is() )
-+    {    
-+        OSL_TRACE("Attempting import of autotext");
-+        xResult =SwTransientGlossaries::GetTransientImportedGlossaries().Import( sTemplateURL );
-+        if ( xResult.is() )
-+            mImportedAutotext.push_back( xResult );
-+        OSL_TRACE("after import of autotext");
-+    }
-+    return xResult;
-+}
- 
- SFX_IMPL_INTERFACE( SwDocShell, SfxObjectShell, SW_RES(0) )
- {
-diff --git sw/source/ui/inc/glosdoc.hxx sw/source/ui/inc/glosdoc.hxx
-index 355078b..9a0273c 100644
---- sw/source/ui/inc/glosdoc.hxx
-+++ sw/source/ui/inc/glosdoc.hxx
-@@ -50,7 +50,9 @@ SV_DECL_REF( SwDocShell )
- #define INCLUDED_VECTOR
- #endif
- #include "swdllapi.h"
--
-+#include <osl/mutex.hxx>
-+#include <com/sun/star/container/XNamed.hpp>
-+#include <hash_map>
- typedef ::com::sun::star::uno::WeakReference< ::com::sun::star::text::XAutoTextGroup > AutoTextGroupRef;
- typedef ::std::vector< AutoTextGroupRef > UnoAutoTextGroups;
- 
-@@ -62,6 +64,7 @@ typedef ::std::vector< AutoTextEntryRef > UnoAutoTextEntries;
- // CLASS -----------------------------------------------------------------
- class SW_DLLPUBLIC SwGlossaries
- {
-+protected:
-     UnoAutoTextGroups       m_aGlossaryGroups;
-     UnoAutoTextEntries      m_aGlossaryEntries;
- 
-@@ -71,6 +74,7 @@ class SW_DLLPUBLIC SwGlossaries
-     SvStrings               *m_pPathArr;
-     SvStrings               *m_pGlosArr;
-     BOOL                    m_bError;
-+	void			UpdateGlosPath(BOOL bFull, const String& rPath );
- 
-     SW_DLLPRIVATE SwTextBlocks*	GetGlosDoc(const String &rName, BOOL bCreate = TRUE) const;
-     SW_DLLPRIVATE SvStrings	    *GetNameList();
-@@ -146,6 +150,26 @@ public:
-     inline ULONG    IsGlosPathErr() { return m_bError; }
-     const SvStrings*    GetPathArray() const {return m_pPathArr;}
- };
--
-+typedef std::vector< ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNamed >  > GlossGroups;
-+typedef  std::hash_map< rtl::OUString, rtl::OUString, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > StringMap;
-+class SW_DLLPUBLIC SwTransientGlossaries : public SwGlossaries
-+{
-+	SwTransientGlossaries() throw( com::sun::star::uno::RuntimeException );
-+	~SwTransientGlossaries();
-+        GlossGroups mGroups;
-+        StringMap PathToGroup;
-+        StringMap GroupToPath;
-+        bool findGroupForPath( StringMap::iterator&, String& );
-+        osl::Mutex   m_aMutex; 
-+public:
-+        com::sun::star::uno::Reference< com::sun::star::container::XNamed > Import( const String& sTemplateURL );
-+        void DeleteGroup( const String& sGroupName );
-+        String GetGroupName( const String& sTemplateURL );
-+        static SwTransientGlossaries& GetTransientImportedGlossaries() throw( com::sun::star::uno::RuntimeException )
-+        {
-+            static SwTransientGlossaries importedGlossaries;
-+            return importedGlossaries;    
-+        }
-+};
- 
- #endif // _GLOSDOC_HXX
-diff --git sw/source/ui/misc/glosdoc.cxx sw/source/ui/misc/glosdoc.cxx
-index a34c374..0647f87 100644
---- sw/source/ui/misc/glosdoc.cxx
-+++ sw/source/ui/misc/glosdoc.cxx
-@@ -62,6 +62,10 @@
- #ifndef _GLOBALS_HRC
- #include <globals.hrc>
- #endif
-+#include <comphelper/processfactory.hxx>
-+#include <rtl/bootstrap.hxx>
-+#include <svx/acorrcfg.hxx>
-+#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
- 
- using namespace ::com::sun::star;
- using namespace ::com::sun::star::uno;
-@@ -487,6 +491,10 @@ void SwGlossaries::UpdateGlosPath(sal_Bool bFull)
- {
-     SvtPathOptions aPathOpt;
-     String aNewPath( aPathOpt.GetAutoTextPath() );
-+}
-+
-+void SwGlossaries::UpdateGlosPath(sal_Bool bFull, const String& aNewPath )
-+{
-     sal_Bool bPathChanged = m_aPath != aNewPath;
-     if (bFull || bPathChanged)
-     {
-@@ -805,5 +813,183 @@ Reference< text::XAutoTextEntry > SwGlossaries::GetAutoTextEntry( const String&
-     return xReturn;
- }
- 
-+SwTransientGlossaries::SwTransientGlossaries() throw ( uno::RuntimeException ) : SwGlossaries()
-+{
-+    rtl::OUString sTransientPath =  rtl::OUString::createFromAscii("${$BRAND_BASE_DIR/program/") + rtl::OUString::createFromAscii( SAL_CONFIGFILE( "bootstrap" ) ) + rtl::OUString::createFromAscii("::UserInstallation}/user/temp/autotext");
-+
-+    rtl::Bootstrap::expandMacros( sTransientPath );
-+    uno::Reference< lang::XMultiServiceFactory > xMCF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
-+    Reference< ucb::XSimpleFileAccess > xSFA( xMCF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
-+
-+    if ( !xSFA->exists( sTransientPath ) )
-+           xSFA->createFolder( sTransientPath ); // will throw if is fails
-+
-+    else if ( !xSFA->isFolder( sTransientPath ) )
-+        throw uno::RuntimeException(); // something very wrong, temp/autotext exists but isn't a folder
-+    // ok we have the folder but maybe there is some stale content 
-+    // ( after a crash maybe? ) so, attempt to empty it
-+    uno::Sequence< rtl::OUString > sDirEntries = xSFA->getFolderContents( sTransientPath, sal_False );
-+    sal_Int32 nItems = sDirEntries.getLength();
-+    for ( sal_Int32 index = 0; index < nItems; ++index )
-+    {
-+        rtl::OUString sItem( sDirEntries[ index ] );
-+        sal_Int32 nDot = sItem.lastIndexOf('.');
-+        if ( nDot > -1 )
-+        {
-+            rtl::OUString sExt = sDirEntries[ index ].copy( nDot + 1 );
-+            if ( sExt.equalsIgnoreAsciiCase( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("bau") ) ) )
-+            {
-+                try
-+                {
-+                   xSFA->kill( sItem );
-+                }
-+                catch( uno::Exception& )
-+                {
-+                }
-+            }
-+        }
-+    } 
-+    UpdateGlosPath( true, sTransientPath ); 
-+}
-+
-+
-+SwTransientGlossaries::~SwTransientGlossaries()
-+{
-+}
-+
-+bool SwTransientGlossaries::findGroupForPath( StringMap::iterator& it, String& sName  )
-+{
-+    
-+    it = GroupToPath.find( sName );
-+    return ( it != PathToGroup.end() );
-+}
-+
-+String SwTransientGlossaries::GetGroupName( const String& sTemplateURL )
-+{
-+    ::osl::MutexGuard aGuard( m_aMutex );
-+    INetURLObject aURL( sTemplateURL );
-+    String sGroupName = aURL.GetLastName();     
-+    aURL.CutLastName();
-+    rtl::OUString sPath = aURL.GetURLPath();
-+    StringMap::iterator it = PathToGroup.find( sPath );
-+    if ( it != PathToGroup.end() )
-+    {
-+        // we already have a group for this path
-+        String sName( it->second );
-+        // append delimiter
-+        sName.AppendAscii("*0");
-+        return sName;
-+    }
-+    // create new groupName
-+    sGroupName = sGroupName.GetToken( 0, '.' );
-+    sal_Int32 index = 0;
-+
-+    // we need to do a reverse lookup to ensure that the groupname is
-+    // not already used ( for a different path ) 
-+    while ( findGroupForPath( it, sGroupName ) )
-+        sGroupName += String::CreateFromInt32( ++index ); 
-+
-+    PathToGroup[ sPath ] = sGroupName;     
-+    GroupToPath[ sGroupName ] = sPath;
-+
-+    sGroupName.AppendAscii("*0");
-+   
-+    
-+    return sGroupName;
-+}
-+
-+typedef  cppu::WeakImplHelper1< container::XNamed > GroupWrapperBASE;
-+Reader* GetWW8Reader();
-+class GroupWrapper : public GroupWrapperBASE
-+{
-+    rtl::OUString msName;
-+public:
-+    GroupWrapper( const rtl::OUString& sName ) : msName( sName )
-+    {
-+        OSL_TRACE(" *** creating GroupWrapper %s", rtl::OUStringToOString( msName, RTL_TEXTENCODING_UTF8 ).getStr() );
-+    }
-+    ~GroupWrapper()
-+    {
-+        OSL_TRACE(" *** deleting GroupWrapper %s", rtl::OUStringToOString( msName, RTL_TEXTENCODING_UTF8 ).getStr() );
-+        // nothing holding a Group, delete it
-+        SwTransientGlossaries::GetTransientImportedGlossaries().DeleteGroup( msName );
-+    }
-+    virtual ::rtl::OUString SAL_CALL getName() throw (uno::RuntimeException)
-+    {
-+        return msName;
-+    }
-+    virtual void SAL_CALL setName( const ::rtl::OUString& aName ) throw (uno::RuntimeException) 
-+    {
-+        throw uno::RuntimeException(); // not supported
-+    }
-+};
- 
-+void SwTransientGlossaries::DeleteGroup( const String& sGroupName )
-+{
-+    ::osl::MutexGuard aGuard( m_aMutex );
-+    StringMap::iterator it = PathToGroup.find( sGroupName );
-+    if ( it != PathToGroup.end() )
-+        PathToGroup.erase( it );
-+    if ( it != GroupToPath.end() )
-+        GroupToPath.erase( it );
-+    DelGroupDoc( sGroupName );
-+}
-+uno::Reference< container::XNamed > SwTransientGlossaries::Import( const String& sTemplateURL )
-+{
-+    ::osl::MutexGuard aGuard( m_aMutex );
-+    uno::Reference< container::XNamed > xRet;
-+    String sGroupName = GetGroupName( sTemplateURL );
-+    OSL_TRACE("** attempt to open %s", rtl::OUStringToOString( sTemplateURL, RTL_TEXTENCODING_UTF8 ).getStr() );
-+    if( sGroupName.Len() )
-+    {
-+        // first see if we have a reference to this
-+        GlossGroups::iterator it_end = mGroups.end();
-+        for( GlossGroups::iterator it = mGroups.begin(); it != it_end; ++it )
-+        {
-+            xRet.set( (*it).get(), uno::UNO_QUERY ) ;
-+            if ( xRet.is() )
-+            {
-+                if ( xRet->getName().equals( sGroupName ) )
-+                {         
-+                    OSL_TRACE("** Found autotext for %s in cache", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
-+                    return xRet;
-+                } 
-+            }
-+            else
-+                mGroups.erase( it ); // lost reference to the group
-+        }
-+        const SfxFilter* pFilter = 0;
-+        std::auto_ptr< SfxMedium > pMed( new SfxMedium( sTemplateURL, STREAM_READ, TRUE, 0, 0 ) );
-+        SfxFilterMatcher aMatcher( String::CreateFromAscii("swriter") );
-+        pMed->UseInteractionHandler( FALSE );
-+        if( !aMatcher.GuessFilter( *pMed, &pFilter, FALSE ) )
-+        {
-+            pMed->SetFilter( pFilter );
-+            std::auto_ptr< Reader > pR( ::GetWW8Reader() );
-+            // should test if equal to ascii defined by FILTER_WW8 
-+            if ( pR.get() && pFilter->GetUserData() == String( RTL_CONSTASCII_USTRINGPARAM( FILTER_WW8 ) ) )
-+            {
-+                pR->SetFltName( pFilter->GetUserData()  );
-+                OSL_TRACE("GroupName is %s", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
- 
-+                SwTextBlocks *pGlossary = GetGroupDoc( sGroupName, true );
-+                if( pR.get() && pGlossary )
-+                {
-+                    SwReader aReader( *pMed, sTemplateURL );
-+                    if( aReader.HasGlossaries( *pR ) )
-+                    {
-+                        const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
-+                        if ( aReader.ReadGlossaries( *pR, *pGlossary, pCfg->IsSaveRelFile() ) )
-+                        {
-+                            xRet = new GroupWrapper( sGroupName );
-+                            mGroups.push_back( xRet ); // cache file and object
-+                        }
-+                        else
-+                            OSL_TRACE("*** Reader says no glossaries!!");
-+                    }
-+                }
-+            }
-+        }
-+    }
-+    return xRet;
-+}
-diff --git sw/source/ui/uno/unoatxt.cxx sw/source/ui/uno/unoatxt.cxx
-index 210b784..6d002cd 100644
---- sw/source/ui/uno/unoatxt.cxx
-+++ sw/source/ui/uno/unoatxt.cxx
-@@ -70,7 +70,44 @@
- SV_IMPL_REF ( SwDocShell )
- using namespace ::com::sun::star;
- using ::rtl::OUString;
-+class SwImportedAutoTextContainer : public SwXAutoTextContainer
-+{
-+    virtual ~SwImportedAutoTextContainer();
-+public:
-+    SwImportedAutoTextContainer();
-+};
-+
-+uno::Reference< uno::XInterface > SAL_CALL SwImportedAutoTextContainer_createInstance(
-+    const uno::Reference< lang::XMultiServiceFactory > & ) throw( uno::Exception )
-+{
-+    //the module may not be loaded
-+    ::vos::OGuard aGuard(Application::GetSolarMutex());
-+    SwDLL::Init();
-+    static uno::Reference< uno::XInterface > xAText = (cppu::OWeakObject*)new SwImportedAutoTextContainer();;
-+    return xAText;
-+}
-+
-+uno::Sequence< OUString > SAL_CALL SwImportedAutoTextContainer_getSupportedServiceNames() throw()
-+{
-+    OUString sService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ImportedAutoTextContainer"));
-+    const uno::Sequence< OUString > aSeq( &sService, 1 );
-+    return aSeq;
-+}
-+
-+OUString SAL_CALL SwImportedAutoTextContainer_getImplementationName() throw()
-+{
-+    return OUString( RTL_CONSTASCII_USTRINGPARAM("SwImportedAutoTextContainer" ) );
-+}
- 
-+SwImportedAutoTextContainer::SwImportedAutoTextContainer()
-+{
-+    pGlossaries = &SwTransientGlossaries::GetTransientImportedGlossaries();
-+}
-+
-+SwImportedAutoTextContainer::~SwImportedAutoTextContainer()
-+{
-+
-+}
- /******************************************************************
-  *
-  ******************************************************************/
-diff --git sw/source/ui/uno/unofreg.cxx sw/source/ui/uno/unofreg.cxx
-index 50e7709..cdb66d6 100644
---- sw/source/ui/uno/unofreg.cxx
-+++ sw/source/ui/uno/unofreg.cxx
-@@ -119,6 +119,10 @@ extern uno::Sequence< OUString > SAL_CALL SwXAutoTextContainer_getSupportedServi
- extern OUString SAL_CALL SwXAutoTextContainer_getImplementationName() throw();
- extern uno::Reference< uno::XInterface > SAL_CALL SwXAutoTextContainer_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
- 
-+extern uno::Sequence< OUString > SAL_CALL SwImportedAutoTextContainer_getSupportedServiceNames() throw();
-+extern OUString SAL_CALL SwImportedAutoTextContainer_getImplementationName() throw();
-+extern uno::Reference< uno::XInterface > SAL_CALL SwImportedAutoTextContainer_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
-+
- extern uno::Sequence< OUString > SAL_CALL SwXModule_getSupportedServiceNames() throw();
- extern OUString SAL_CALL SwXModule_getImplementationName() throw();
- extern uno::Reference< uno::XInterface > SAL_CALL SwXModule_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
-@@ -216,6 +220,8 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
-             //API objects
-             lcl_uno_writeInfo( pKey, SwXAutoTextContainer_getImplementationName(),
-                                SwXAutoTextContainer_getSupportedServiceNames() );
-+            lcl_uno_writeInfo( pKey, SwImportedAutoTextContainer_getImplementationName(),
-+                               SwImportedAutoTextContainer_getSupportedServiceNames() );
-             lcl_uno_writeInfo( pKey, SwXModule_getImplementationName(),
-                                SwXModule_getSupportedServiceNames() );
-             lcl_uno_writeInfo( pKey, SwXMailMerge_getImplementationName(),
-@@ -400,6 +406,15 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
-                 SwXAutoTextContainer_createInstance,
-                 SwXAutoTextContainer_getSupportedServiceNames() );
-         }
-+        else if( SwImportedAutoTextContainer_getImplementationName().equalsAsciiL(
-+                                                    pImplName, nImplNameLen ) )
-+        {
-+            xFactory = ::cppu::createSingleFactory( xMSF,
-+                SwImportedAutoTextContainer_getImplementationName(),
-+                SwImportedAutoTextContainer_createInstance,
-+                SwImportedAutoTextContainer_getSupportedServiceNames() );
-+        }
-+
-         else if( SwXModule_getImplementationName().equalsAsciiL(
-                                                     pImplName, nImplNameLen ) )
-         {
-diff --git sw/source/ui/vba/vbadocument.cxx sw/source/ui/vba/vbadocument.cxx
-index 1090a8b..f82b69c 100644
---- sw/source/ui/vba/vbadocument.cxx
-+++ sw/source/ui/vba/vbadocument.cxx
-@@ -245,7 +245,7 @@ SwVbaDocument::getAttachedTemplate() throw (uno::RuntimeException)
-     uno::Reference< document::XDocumentProperties > xDocProps( xDocPropSupp->getDocumentProperties(), uno::UNO_QUERY_THROW );
-     rtl::OUString sTemplateName = xDocProps->getTemplateName();
- 
--    xTemplate = new SwVbaTemplate( this, mxContext, getModel(), sTemplateName );
-+    xTemplate = new SwVbaTemplate( this, mxContext, getModel(), sTemplateName, xDocProps->getTemplateURL() );
-     return uno::makeAny( xTemplate );
- }
- 
-diff --git sw/source/ui/vba/vbatemplate.cxx sw/source/ui/vba/vbatemplate.cxx
-index 9413428..485a864 100644
---- sw/source/ui/vba/vbatemplate.cxx
-+++ sw/source/ui/vba/vbatemplate.cxx
-@@ -33,12 +33,12 @@
- #include "vbaautotextentry.hxx"
- #include <comphelper/processfactory.hxx>
- #include <com/sun/star/text/XAutoTextContainer.hpp>
--
-+#include <docsh.hxx>
- using namespace ::ooo::vba;
- using namespace ::com::sun::star;
- 
--SwVbaTemplate::SwVbaTemplate( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& rName )
--    : SwVbaTemplate_BASE( rParent, rContext ), mxModel( rModel ), msName( rName )
-+SwVbaTemplate::SwVbaTemplate( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& rName, const rtl::OUString& rURL )
-+    : SwVbaTemplate_BASE( rParent, rContext ), mxModel( rModel ), msName( rName ), msURL( rURL )
- {
- }
- 
-@@ -57,16 +57,14 @@ uno::Any SAL_CALL
- SwVbaTemplate::AutoTextEntries( const uno::Any& index ) throw (uno::RuntimeException)
- {
-     uno::Reference< lang::XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory();
--    uno::Reference< text::XAutoTextContainer > xAutoTextContainer( xMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.AutoTextContainer") ) ), uno::UNO_QUERY_THROW );
-+    uno::Reference< text::XAutoTextContainer > xAutoTextContainer( xMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ImportedAutoTextContainer") ) ), uno::UNO_QUERY_THROW );
-+    
-+    SwDocShell* pDocShell = word::getDocShell( mxModel );
- 
--    // the default template is "Normal.dot" in Word.
--    rtl::OUString sGroup( RTL_CONSTASCII_USTRINGPARAM("Normal") );
--    if( sal_Int32 nIndex = msName.lastIndexOf( sal_Unicode('.') ) > 0 )
--    {
--        sGroup = msName.copy( 0, msName.lastIndexOf( sal_Unicode('.') ) );
--       // OSL_TRACE("SwVbaTemplate::AutoTextEntries: %s", rtl::OUStringToOString( sGroup, RTL_TEXTENCODING_UTF8 ).getStr() );
--    }
-+    uno::Reference< container::XNamed > xGroupName( pDocShell->AutoTextImporter().ImportAutoText( msURL ), uno::UNO_QUERY_THROW );
-     
-+    rtl::OUString sGroup = xGroupName->getName();
-+
-     uno::Reference< container::XIndexAccess > xGroup;
-     if( xAutoTextContainer->hasByName( sGroup ) )
-     {
-diff --git sw/source/ui/vba/vbatemplate.hxx sw/source/ui/vba/vbatemplate.hxx
-index df8848b..84caaf0 100644
---- sw/source/ui/vba/vbatemplate.hxx
-+++ sw/source/ui/vba/vbatemplate.hxx
-@@ -40,9 +40,10 @@ class SwVbaTemplate : public SwVbaTemplate_BASE
- private:
-     css::uno::Reference< css::frame::XModel > mxModel;
-     rtl::OUString msName;
-+    rtl::OUString msURL;
- public:
- 	SwVbaTemplate( const css::uno::Reference< ooo::vba::XHelperInterface >& rParent, const css::uno::Reference< css::uno::XComponentContext >& rContext, 
--        const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& );
-+        const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString&, const rtl::OUString& );
- 	virtual ~SwVbaTemplate();
- 
-    // XTemplate
diff --git a/patches/vba/vba-transient-imported-autotext.diff b/patches/vba/vba-transient-imported-autotext.diff
new file mode 100644
index 0000000..96d8d85
--- /dev/null
+++ b/patches/vba/vba-transient-imported-autotext.diff
@@ -0,0 +1,543 @@
+diff --git sw/inc/docsh.hxx sw/inc/docsh.hxx
+index 9d76217..ac2fb3e 100644
+--- sw/inc/docsh.hxx
++++ sw/inc/docsh.hxx
+@@ -32,6 +32,7 @@
+ 
+ #include <rtl/ref.hxx>
+ #include <com/sun/star/frame/XController.hpp>
++#include <com/sun/star/container/XNamed.hpp>
+ #include <vcl/timer.hxx>
+ #include <sfx2/docfac.hxx>
+ #include <sfx2/objsh.hxx>
+@@ -62,6 +63,12 @@ class IDocumentSettingAccess;
+ class IDocumentTimerAccess;
+ class IDocumentChartDataProviderAccess;
+ 
++class SW_DLLPUBLIC SwImportedAutoText
++{
++    std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > > mImportedAutotext;    
++public:
++    ::com::sun::star::uno::Reference<   ::com::sun::star::container::XNamed > ImportAutoText( const String& TemplateURL );
++};
+ 
+ class SW_DLLPUBLIC SwDocShell: public SfxObjectShell, public SfxListener
+ {
+@@ -86,6 +93,7 @@ class SW_DLLPUBLIC SwDocShell: public SfxObjectShell, public SfxListener
+     sal_Int16               nUpdateDocMode; // contains the com::sun::star::document::UpdateDocMode
+     bool                    bInUpdateFontList; //prevent nested calls of UpdateFontList
+     bool                    bIsATemplate; //prevent nested calls of UpdateFontList
++    SwImportedAutoText mImportedAutoText;
+     // Methoden fuer den Zugriff aufs Doc
+     SW_DLLPRIVATE void					AddLink();
+     SW_DLLPRIVATE void					RemoveLink();
+@@ -302,6 +310,7 @@ public:
+     SfxInPlaceClient* GetIPClient( const ::svt::EmbeddedObjectRef& xObjRef );
+     SW_DLLPRIVATE sal_Bool IsTemplate() { return bIsATemplate; }
+     SW_DLLPRIVATE void SetIsTemplate( bool bValue ) { bIsATemplate = bValue; }
++    SwImportedAutoText& AutoTextImporter(){ return mImportedAutoText; }
+ };
+ 
+ class Graphic;
+diff --git sw/inc/unoatxt.hxx sw/inc/unoatxt.hxx
+index e54d4b0..a152f56 100644
+--- sw/inc/unoatxt.hxx
++++ sw/inc/unoatxt.hxx
+@@ -75,9 +75,9 @@ class SwXAutoTextContainer : public cppu::WeakImplHelper3
+     ::com::sun::star::container::XIndexAccess
+ >
+ {
+-    SwGlossaries *pGlossaries;
+ 
+ protected:
++    SwGlossaries *pGlossaries;
+     virtual ~SwXAutoTextContainer();	// ref-counted objects are not to be deleted from outside -> protected dtor
+ 
+ public:
+diff --git sw/source/core/swg/SwXMLTextBlocks.cxx sw/source/core/swg/SwXMLTextBlocks.cxx
+index 15e91e7..0386378 100644
+--- sw/source/core/swg/SwXMLTextBlocks.cxx
++++ sw/source/core/swg/SwXMLTextBlocks.cxx
+@@ -92,6 +92,7 @@ SwXMLTextBlocks::SwXMLTextBlocks( const String& rFile )
+     try
+     {
+         refStg  = comphelper::OStorageHelper::GetStorageFromURL( rFile, embed::ElementModes::READWRITE );
++	Touch(); // update creation & modification times ( on slow systems IsFileChanged can fail )
+         bReadOnly = FALSE;
+     }
+     catch( const uno::Exception& )
+diff --git sw/source/ui/app/docsh.cxx sw/source/ui/app/docsh.cxx
+index dd2f32d..87553e4 100644
+--- sw/source/ui/app/docsh.cxx
++++ sw/source/ui/app/docsh.cxx
+@@ -162,6 +162,7 @@
+ #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+ 
+ #include <unomid.h>
++#include "glosdoc.hxx"
+ 
+ using rtl::OUString;
+ using namespace ::com::sun::star;
+@@ -169,6 +170,32 @@ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::script;
+ using namespace ::com::sun::star::container;
+ 
++uno::Reference< container::XNamed >
++SwImportedAutoText::ImportAutoText( const String& sTemplateURL )
++{
++    uno::Reference< container::XNamed > xResult;
++    // see if we already have imported this template
++    std::vector< uno::Reference< container::XNamed > >::iterator it_end = mImportedAutotext.end();
++    rtl::OUString sGroupName = SwTransientGlossaries::GetTransientImportedGlossaries().GetGroupName( sTemplateURL );
++
++    for ( std::vector< uno::Reference< container::XNamed > >::iterator it = mImportedAutotext.begin(); it != it_end; ++it )
++    {
++        if ( (*it)->getName().equals( sGroupName ) )
++        {
++            xResult = (*it);
++            break; 
++        } 
++    }
++    if ( !xResult.is() )
++    {    
++        OSL_TRACE("Attempting import of autotext");
++        xResult =SwTransientGlossaries::GetTransientImportedGlossaries().Import( sTemplateURL );
++        if ( xResult.is() )
++            mImportedAutotext.push_back( xResult );
++        OSL_TRACE("after import of autotext");
++    }
++    return xResult;
++}
+ 
+ SFX_IMPL_INTERFACE( SwDocShell, SfxObjectShell, SW_RES(0) )
+ {
+diff --git sw/source/ui/inc/glosdoc.hxx sw/source/ui/inc/glosdoc.hxx
+index 355078b..9a0273c 100644
+--- sw/source/ui/inc/glosdoc.hxx
++++ sw/source/ui/inc/glosdoc.hxx
+@@ -50,7 +50,9 @@ SV_DECL_REF( SwDocShell )
+ #define INCLUDED_VECTOR
+ #endif
+ #include "swdllapi.h"
+-
++#include <osl/mutex.hxx>
++#include <com/sun/star/container/XNamed.hpp>
++#include <hash_map>
+ typedef ::com::sun::star::uno::WeakReference< ::com::sun::star::text::XAutoTextGroup > AutoTextGroupRef;
+ typedef ::std::vector< AutoTextGroupRef > UnoAutoTextGroups;
+ 
+@@ -62,6 +64,7 @@ typedef ::std::vector< AutoTextEntryRef > UnoAutoTextEntries;
+ // CLASS -----------------------------------------------------------------
+ class SW_DLLPUBLIC SwGlossaries
+ {
++protected:
+     UnoAutoTextGroups       m_aGlossaryGroups;
+     UnoAutoTextEntries      m_aGlossaryEntries;
+ 
+@@ -71,6 +74,7 @@ class SW_DLLPUBLIC SwGlossaries
+     SvStrings               *m_pPathArr;
+     SvStrings               *m_pGlosArr;
+     BOOL                    m_bError;
++	void			UpdateGlosPath(BOOL bFull, const String& rPath );
+ 
+     SW_DLLPRIVATE SwTextBlocks*	GetGlosDoc(const String &rName, BOOL bCreate = TRUE) const;
+     SW_DLLPRIVATE SvStrings	    *GetNameList();
+@@ -146,6 +150,26 @@ public:
+     inline ULONG    IsGlosPathErr() { return m_bError; }
+     const SvStrings*    GetPathArray() const {return m_pPathArr;}
+ };
+-
++typedef std::vector< ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNamed >  > GlossGroups;
++typedef  std::hash_map< rtl::OUString, rtl::OUString, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > StringMap;
++class SW_DLLPUBLIC SwTransientGlossaries : public SwGlossaries
++{
++	SwTransientGlossaries() throw( com::sun::star::uno::RuntimeException );
++	~SwTransientGlossaries();
++        GlossGroups mGroups;
++        StringMap PathToGroup;
++        StringMap GroupToPath;
++        bool findGroupForPath( StringMap::iterator&, String& );
++        osl::Mutex   m_aMutex; 
++public:
++        com::sun::star::uno::Reference< com::sun::star::container::XNamed > Import( const String& sTemplateURL );
++        void DeleteGroup( const String& sGroupName );
++        String GetGroupName( const String& sTemplateURL );
++        static SwTransientGlossaries& GetTransientImportedGlossaries() throw( com::sun::star::uno::RuntimeException )
++        {
++            static SwTransientGlossaries importedGlossaries;
++            return importedGlossaries;    
++        }
++};
+ 
+ #endif // _GLOSDOC_HXX
+diff --git sw/source/ui/misc/glosdoc.cxx sw/source/ui/misc/glosdoc.cxx
+index a34c374..0647f87 100644
+--- sw/source/ui/misc/glosdoc.cxx
++++ sw/source/ui/misc/glosdoc.cxx
+@@ -62,6 +62,10 @@
+ #ifndef _GLOBALS_HRC
+ #include <globals.hrc>
+ #endif
++#include <comphelper/processfactory.hxx>
++#include <rtl/bootstrap.hxx>
++#include <svx/acorrcfg.hxx>
++#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
+ 
+ using namespace ::com::sun::star;
+ using namespace ::com::sun::star::uno;
+@@ -487,6 +491,10 @@ void SwGlossaries::UpdateGlosPath(sal_Bool bFull)
+ {
+     SvtPathOptions aPathOpt;
+     String aNewPath( aPathOpt.GetAutoTextPath() );
++}
++
++void SwGlossaries::UpdateGlosPath(sal_Bool bFull, const String& aNewPath )
++{
+     sal_Bool bPathChanged = m_aPath != aNewPath;
+     if (bFull || bPathChanged)
+     {
+@@ -805,5 +813,183 @@ Reference< text::XAutoTextEntry > SwGlossaries::GetAutoTextEntry( const String&
+     return xReturn;
+ }
+ 
++SwTransientGlossaries::SwTransientGlossaries() throw ( uno::RuntimeException ) : SwGlossaries()
++{
++    rtl::OUString sTransientPath =  rtl::OUString::createFromAscii("${$BRAND_BASE_DIR/program/") + rtl::OUString::createFromAscii( SAL_CONFIGFILE( "bootstrap" ) ) + rtl::OUString::createFromAscii("::UserInstallation}/user/temp/autotext");
++
++    rtl::Bootstrap::expandMacros( sTransientPath );
++    uno::Reference< lang::XMultiServiceFactory > xMCF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
++    Reference< ucb::XSimpleFileAccess > xSFA( xMCF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
++
++    if ( !xSFA->exists( sTransientPath ) )
++           xSFA->createFolder( sTransientPath ); // will throw if is fails
++
++    else if ( !xSFA->isFolder( sTransientPath ) )
++        throw uno::RuntimeException(); // something very wrong, temp/autotext exists but isn't a folder
++    // ok we have the folder but maybe there is some stale content 
++    // ( after a crash maybe? ) so, attempt to empty it
++    uno::Sequence< rtl::OUString > sDirEntries = xSFA->getFolderContents( sTransientPath, sal_False );
++    sal_Int32 nItems = sDirEntries.getLength();
++    for ( sal_Int32 index = 0; index < nItems; ++index )
++    {
++        rtl::OUString sItem( sDirEntries[ index ] );
++        sal_Int32 nDot = sItem.lastIndexOf('.');
++        if ( nDot > -1 )
++        {
++            rtl::OUString sExt = sDirEntries[ index ].copy( nDot + 1 );
++            if ( sExt.equalsIgnoreAsciiCase( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("bau") ) ) )
++            {
++                try
++                {
++                   xSFA->kill( sItem );
++                }
++                catch( uno::Exception& )
++                {
++                }
++            }
++        }
++    } 
++    UpdateGlosPath( true, sTransientPath ); 
++}
++
++
++SwTransientGlossaries::~SwTransientGlossaries()
++{
++}
++
++bool SwTransientGlossaries::findGroupForPath( StringMap::iterator& it, String& sName  )
++{
++    
++    it = GroupToPath.find( sName );
++    return ( it != PathToGroup.end() );
++}
++
++String SwTransientGlossaries::GetGroupName( const String& sTemplateURL )
++{
++    ::osl::MutexGuard aGuard( m_aMutex );
++    INetURLObject aURL( sTemplateURL );
++    String sGroupName = aURL.GetLastName();     
++    aURL.CutLastName();
++    rtl::OUString sPath = aURL.GetURLPath();
++    StringMap::iterator it = PathToGroup.find( sPath );
++    if ( it != PathToGroup.end() )
++    {
++        // we already have a group for this path
++        String sName( it->second );
++        // append delimiter
++        sName.AppendAscii("*0");
++        return sName;
++    }
++    // create new groupName
++    sGroupName = sGroupName.GetToken( 0, '.' );
++    sal_Int32 index = 0;
++
++    // we need to do a reverse lookup to ensure that the groupname is
++    // not already used ( for a different path ) 
++    while ( findGroupForPath( it, sGroupName ) )
++        sGroupName += String::CreateFromInt32( ++index ); 
++
++    PathToGroup[ sPath ] = sGroupName;     
++    GroupToPath[ sGroupName ] = sPath;
++
++    sGroupName.AppendAscii("*0");
++   
++    
++    return sGroupName;
++}
++
++typedef  cppu::WeakImplHelper1< container::XNamed > GroupWrapperBASE;
++Reader* GetWW8Reader();
++class GroupWrapper : public GroupWrapperBASE
++{
++    rtl::OUString msName;
++public:
++    GroupWrapper( const rtl::OUString& sName ) : msName( sName )
++    {
++        OSL_TRACE(" *** creating GroupWrapper %s", rtl::OUStringToOString( msName, RTL_TEXTENCODING_UTF8 ).getStr() );
++    }
++    ~GroupWrapper()
++    {
++        OSL_TRACE(" *** deleting GroupWrapper %s", rtl::OUStringToOString( msName, RTL_TEXTENCODING_UTF8 ).getStr() );
++        // nothing holding a Group, delete it
++        SwTransientGlossaries::GetTransientImportedGlossaries().DeleteGroup( msName );
++    }
++    virtual ::rtl::OUString SAL_CALL getName() throw (uno::RuntimeException)
++    {
++        return msName;
++    }
++    virtual void SAL_CALL setName( const ::rtl::OUString& aName ) throw (uno::RuntimeException) 
++    {
++        throw uno::RuntimeException(); // not supported
++    }
++};
+ 
++void SwTransientGlossaries::DeleteGroup( const String& sGroupName )
++{
++    ::osl::MutexGuard aGuard( m_aMutex );
++    StringMap::iterator it = PathToGroup.find( sGroupName );
++    if ( it != PathToGroup.end() )
++        PathToGroup.erase( it );
++    if ( it != GroupToPath.end() )
++        GroupToPath.erase( it );
++    DelGroupDoc( sGroupName );
++}
++uno::Reference< container::XNamed > SwTransientGlossaries::Import( const String& sTemplateURL )
++{
++    ::osl::MutexGuard aGuard( m_aMutex );
++    uno::Reference< container::XNamed > xRet;
++    String sGroupName = GetGroupName( sTemplateURL );
++    OSL_TRACE("** attempt to open %s", rtl::OUStringToOString( sTemplateURL, RTL_TEXTENCODING_UTF8 ).getStr() );
++    if( sGroupName.Len() )
++    {
++        // first see if we have a reference to this
++        GlossGroups::iterator it_end = mGroups.end();
++        for( GlossGroups::iterator it = mGroups.begin(); it != it_end; ++it )
++        {
++            xRet.set( (*it).get(), uno::UNO_QUERY ) ;
++            if ( xRet.is() )
++            {
++                if ( xRet->getName().equals( sGroupName ) )
++                {         
++                    OSL_TRACE("** Found autotext for %s in cache", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
++                    return xRet;
++                } 
++            }
++            else
++                mGroups.erase( it ); // lost reference to the group
++        }
++        const SfxFilter* pFilter = 0;
++        std::auto_ptr< SfxMedium > pMed( new SfxMedium( sTemplateURL, STREAM_READ, TRUE, 0, 0 ) );
++        SfxFilterMatcher aMatcher( String::CreateFromAscii("swriter") );
++        pMed->UseInteractionHandler( FALSE );
++        if( !aMatcher.GuessFilter( *pMed, &pFilter, FALSE ) )
++        {
++            pMed->SetFilter( pFilter );
++            std::auto_ptr< Reader > pR( ::GetWW8Reader() );
++            // should test if equal to ascii defined by FILTER_WW8 
++            if ( pR.get() && pFilter->GetUserData() == String( RTL_CONSTASCII_USTRINGPARAM( FILTER_WW8 ) ) )
++            {
++                pR->SetFltName( pFilter->GetUserData()  );
++                OSL_TRACE("GroupName is %s", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
+ 
++                SwTextBlocks *pGlossary = GetGroupDoc( sGroupName, true );
++                if( pR.get() && pGlossary )
++                {
++                    SwReader aReader( *pMed, sTemplateURL );
++                    if( aReader.HasGlossaries( *pR ) )
++                    {
++                        const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
++                        if ( aReader.ReadGlossaries( *pR, *pGlossary, pCfg->IsSaveRelFile() ) )
++                        {
++                            xRet = new GroupWrapper( sGroupName );
++                            mGroups.push_back( xRet ); // cache file and object
++                        }
++                        else
++                            OSL_TRACE("*** Reader says no glossaries!!");
++                    }
++                }
++            }
++        }
++    }
++    return xRet;
++}
+diff --git sw/source/ui/uno/unoatxt.cxx sw/source/ui/uno/unoatxt.cxx
+index 210b784..6d002cd 100644
+--- sw/source/ui/uno/unoatxt.cxx
++++ sw/source/ui/uno/unoatxt.cxx
+@@ -70,7 +70,44 @@
+ SV_IMPL_REF ( SwDocShell )
+ using namespace ::com::sun::star;
+ using ::rtl::OUString;
++class SwImportedAutoTextContainer : public SwXAutoTextContainer
++{
++    virtual ~SwImportedAutoTextContainer();
++public:
++    SwImportedAutoTextContainer();
++};
++
++uno::Reference< uno::XInterface > SAL_CALL SwImportedAutoTextContainer_createInstance(
++    const uno::Reference< lang::XMultiServiceFactory > & ) throw( uno::Exception )
++{
++    //the module may not be loaded
++    ::vos::OGuard aGuard(Application::GetSolarMutex());
++    SwDLL::Init();
++    static uno::Reference< uno::XInterface > xAText = (cppu::OWeakObject*)new SwImportedAutoTextContainer();;
++    return xAText;
++}
++
++uno::Sequence< OUString > SAL_CALL SwImportedAutoTextContainer_getSupportedServiceNames() throw()
++{
++    OUString sService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ImportedAutoTextContainer"));
++    const uno::Sequence< OUString > aSeq( &sService, 1 );
++    return aSeq;
++}
++
++OUString SAL_CALL SwImportedAutoTextContainer_getImplementationName() throw()
++{
++    return OUString( RTL_CONSTASCII_USTRINGPARAM("SwImportedAutoTextContainer" ) );
++}
+ 
++SwImportedAutoTextContainer::SwImportedAutoTextContainer()
++{
++    pGlossaries = &SwTransientGlossaries::GetTransientImportedGlossaries();
++}
++
++SwImportedAutoTextContainer::~SwImportedAutoTextContainer()
++{
++
++}
+ /******************************************************************
+  *
+  ******************************************************************/
+diff --git sw/source/ui/uno/unofreg.cxx sw/source/ui/uno/unofreg.cxx
+index 50e7709..cdb66d6 100644
+--- sw/source/ui/uno/unofreg.cxx
++++ sw/source/ui/uno/unofreg.cxx
+@@ -119,6 +119,10 @@ extern uno::Sequence< OUString > SAL_CALL SwXAutoTextContainer_getSupportedServi
+ extern OUString SAL_CALL SwXAutoTextContainer_getImplementationName() throw();
+ extern uno::Reference< uno::XInterface > SAL_CALL SwXAutoTextContainer_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
+ 
++extern uno::Sequence< OUString > SAL_CALL SwImportedAutoTextContainer_getSupportedServiceNames() throw();
++extern OUString SAL_CALL SwImportedAutoTextContainer_getImplementationName() throw();
++extern uno::Reference< uno::XInterface > SAL_CALL SwImportedAutoTextContainer_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
++
+ extern uno::Sequence< OUString > SAL_CALL SwXModule_getSupportedServiceNames() throw();
+ extern OUString SAL_CALL SwXModule_getImplementationName() throw();
+ extern uno::Reference< uno::XInterface > SAL_CALL SwXModule_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
+@@ -216,6 +220,8 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
+             //API objects
+             lcl_uno_writeInfo( pKey, SwXAutoTextContainer_getImplementationName(),
+                                SwXAutoTextContainer_getSupportedServiceNames() );
++            lcl_uno_writeInfo( pKey, SwImportedAutoTextContainer_getImplementationName(),
++                               SwImportedAutoTextContainer_getSupportedServiceNames() );
+             lcl_uno_writeInfo( pKey, SwXModule_getImplementationName(),
+                                SwXModule_getSupportedServiceNames() );
+             lcl_uno_writeInfo( pKey, SwXMailMerge_getImplementationName(),
+@@ -400,6 +406,15 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
+                 SwXAutoTextContainer_createInstance,
+                 SwXAutoTextContainer_getSupportedServiceNames() );
+         }
++        else if( SwImportedAutoTextContainer_getImplementationName().equalsAsciiL(
++                                                    pImplName, nImplNameLen ) )
++        {
++            xFactory = ::cppu::createSingleFactory( xMSF,
++                SwImportedAutoTextContainer_getImplementationName(),
++                SwImportedAutoTextContainer_createInstance,
++                SwImportedAutoTextContainer_getSupportedServiceNames() );
++        }
++
+         else if( SwXModule_getImplementationName().equalsAsciiL(
+                                                     pImplName, nImplNameLen ) )
+         {
+diff --git sw/source/ui/vba/vbadocument.cxx sw/source/ui/vba/vbadocument.cxx
+index 1090a8b..f82b69c 100644
+--- sw/source/ui/vba/vbadocument.cxx
++++ sw/source/ui/vba/vbadocument.cxx
+@@ -245,7 +245,7 @@ SwVbaDocument::getAttachedTemplate() throw (uno::RuntimeException)
+     uno::Reference< document::XDocumentProperties > xDocProps( xDocPropSupp->getDocumentProperties(), uno::UNO_QUERY_THROW );
+     rtl::OUString sTemplateName = xDocProps->getTemplateName();
+ 
+-    xTemplate = new SwVbaTemplate( this, mxContext, getModel(), sTemplateName );
++    xTemplate = new SwVbaTemplate( this, mxContext, getModel(), sTemplateName, xDocProps->getTemplateURL() );
+     return uno::makeAny( xTemplate );
+ }
+ 
+diff --git sw/source/ui/vba/vbatemplate.cxx sw/source/ui/vba/vbatemplate.cxx
+index 9413428..485a864 100644
+--- sw/source/ui/vba/vbatemplate.cxx
++++ sw/source/ui/vba/vbatemplate.cxx
+@@ -33,12 +33,12 @@
+ #include "vbaautotextentry.hxx"
+ #include <comphelper/processfactory.hxx>
+ #include <com/sun/star/text/XAutoTextContainer.hpp>
+-
++#include <docsh.hxx>
+ using namespace ::ooo::vba;
+ using namespace ::com::sun::star;
+ 
+-SwVbaTemplate::SwVbaTemplate( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& rName )
+-    : SwVbaTemplate_BASE( rParent, rContext ), mxModel( rModel ), msName( rName )
++SwVbaTemplate::SwVbaTemplate( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& rName, const rtl::OUString& rURL )
++    : SwVbaTemplate_BASE( rParent, rContext ), mxModel( rModel ), msName( rName ), msURL( rURL )
+ {
+ }
+ 
+@@ -57,16 +57,14 @@ uno::Any SAL_CALL
+ SwVbaTemplate::AutoTextEntries( const uno::Any& index ) throw (uno::RuntimeException)
+ {
+     uno::Reference< lang::XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory();
+-    uno::Reference< text::XAutoTextContainer > xAutoTextContainer( xMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.AutoTextContainer") ) ), uno::UNO_QUERY_THROW );
++    uno::Reference< text::XAutoTextContainer > xAutoTextContainer( xMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ImportedAutoTextContainer") ) ), uno::UNO_QUERY_THROW );
++    
++    SwDocShell* pDocShell = word::getDocShell( mxModel );
+ 
+-    // the default template is "Normal.dot" in Word.
+-    rtl::OUString sGroup( RTL_CONSTASCII_USTRINGPARAM("Normal") );
+-    if( sal_Int32 nIndex = msName.lastIndexOf( sal_Unicode('.') ) > 0 )
+-    {
+-        sGroup = msName.copy( 0, msName.lastIndexOf( sal_Unicode('.') ) );
+-       // OSL_TRACE("SwVbaTemplate::AutoTextEntries: %s", rtl::OUStringToOString( sGroup, RTL_TEXTENCODING_UTF8 ).getStr() );
+-    }
++    uno::Reference< container::XNamed > xGroupName( pDocShell->AutoTextImporter().ImportAutoText( msURL ), uno::UNO_QUERY_THROW );
+     
++    rtl::OUString sGroup = xGroupName->getName();
++
+     uno::Reference< container::XIndexAccess > xGroup;
+     if( xAutoTextContainer->hasByName( sGroup ) )
+     {
+diff --git sw/source/ui/vba/vbatemplate.hxx sw/source/ui/vba/vbatemplate.hxx
+index df8848b..84caaf0 100644
+--- sw/source/ui/vba/vbatemplate.hxx
++++ sw/source/ui/vba/vbatemplate.hxx
+@@ -40,9 +40,10 @@ class SwVbaTemplate : public SwVbaTemplate_BASE
+ private:
+     css::uno::Reference< css::frame::XModel > mxModel;
+     rtl::OUString msName;
++    rtl::OUString msURL;
+ public:
+ 	SwVbaTemplate( const css::uno::Reference< ooo::vba::XHelperInterface >& rParent, const css::uno::Reference< css::uno::XComponentContext >& rContext, 
+-        const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& );
++        const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString&, const rtl::OUString& );
+ 	virtual ~SwVbaTemplate();
+ 
+    // XTemplate
commit 4642e01e0b6a17942eab4eee813fa6b05bded73f
Author: Noel Power <noel.power at novell.com>
Date:   Tue Aug 11 13:02:53 2009 +0100

    wrapper around autotext functionality specifically for imported autotext
    
    * patches/vba-transient-imported-autotext.diff:

diff --git a/patches/vba-transient-imported-autotext.diff b/patches/vba-transient-imported-autotext.diff
new file mode 100644
index 0000000..19e5c64
--- /dev/null
+++ b/patches/vba-transient-imported-autotext.diff
@@ -0,0 +1,557 @@
+diff --git sw/inc/docsh.hxx sw/inc/docsh.hxx
+index 9d76217..ac2fb3e 100644
+--- sw/inc/docsh.hxx
++++ sw/inc/docsh.hxx
+@@ -32,6 +32,7 @@
+ 
+ #include <rtl/ref.hxx>
+ #include <com/sun/star/frame/XController.hpp>
++#include <com/sun/star/container/XNamed.hpp>
+ #include <vcl/timer.hxx>
+ #include <sfx2/docfac.hxx>
+ #include <sfx2/objsh.hxx>
+@@ -62,6 +63,12 @@ class IDocumentSettingAccess;
+ class IDocumentTimerAccess;
+ class IDocumentChartDataProviderAccess;
+ 
++class SW_DLLPUBLIC SwImportedAutoText
++{
++    std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > > mImportedAutotext;    
++public:
++    ::com::sun::star::uno::Reference<   ::com::sun::star::container::XNamed > ImportAutoText( const String& TemplateURL );
++};
+ 
+ class SW_DLLPUBLIC SwDocShell: public SfxObjectShell, public SfxListener
+ {
+@@ -86,6 +93,7 @@ class SW_DLLPUBLIC SwDocShell: public SfxObjectShell, public SfxListener
+     sal_Int16               nUpdateDocMode; // contains the com::sun::star::document::UpdateDocMode
+     bool                    bInUpdateFontList; //prevent nested calls of UpdateFontList
+     bool                    bIsATemplate; //prevent nested calls of UpdateFontList
++    SwImportedAutoText mImportedAutoText;
+     // Methoden fuer den Zugriff aufs Doc
+     SW_DLLPRIVATE void					AddLink();
+     SW_DLLPRIVATE void					RemoveLink();
+@@ -302,6 +310,7 @@ public:
+     SfxInPlaceClient* GetIPClient( const ::svt::EmbeddedObjectRef& xObjRef );
+     SW_DLLPRIVATE sal_Bool IsTemplate() { return bIsATemplate; }
+     SW_DLLPRIVATE void SetIsTemplate( bool bValue ) { bIsATemplate = bValue; }
++    SwImportedAutoText& AutoTextImporter(){ return mImportedAutoText; }
+ };
+ 
+ class Graphic;
+diff --git sw/inc/unoatxt.hxx sw/inc/unoatxt.hxx
+index e54d4b0..a152f56 100644
+--- sw/inc/unoatxt.hxx
++++ sw/inc/unoatxt.hxx
+@@ -75,9 +75,9 @@ class SwXAutoTextContainer : public cppu::WeakImplHelper3
+     ::com::sun::star::container::XIndexAccess
+ >
+ {
+-    SwGlossaries *pGlossaries;
+ 
+ protected:
++    SwGlossaries *pGlossaries;
+     virtual ~SwXAutoTextContainer();	// ref-counted objects are not to be deleted from outside -> protected dtor
+ 
+ public:
+diff --git sw/source/core/swg/SwXMLTextBlocks.cxx sw/source/core/swg/SwXMLTextBlocks.cxx
+index 15e91e7..0386378 100644
+--- sw/source/core/swg/SwXMLTextBlocks.cxx
++++ sw/source/core/swg/SwXMLTextBlocks.cxx
+@@ -92,6 +92,7 @@ SwXMLTextBlocks::SwXMLTextBlocks( const String& rFile )
+     try
+     {
+         refStg  = comphelper::OStorageHelper::GetStorageFromURL( rFile, embed::ElementModes::READWRITE );
++	Touch(); // update creation & modification times ( on slow systems IsFileChanged can fail )
+         bReadOnly = FALSE;
+     }
+     catch( const uno::Exception& )
+diff --git sw/source/filter/ww8/ww8par.cxx sw/source/filter/ww8/ww8par.cxx
+index febac10..fdd7a97 100644
+--- sw/source/filter/ww8/ww8par.cxx
++++ sw/source/filter/ww8/ww8par.cxx
+@@ -4227,6 +4227,9 @@ ULONG SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos)
+ 
+             // Read Global templates 
+             ReadGlobalTemplateSettings( sCreatedFrom, xPrjNameCache );
++            rtl::OUString sAttachedTemplate = rtl::OUString::createFromAscii("file:///data4/home/npower/swedish-police-mallar/Word/rp_ansta.dot");
++            mpDocShell->AutoTextImporter().ImportAutoText( sAttachedTemplate );
++
+ #endif 
+             // Create and insert Word vba Globals
+             uno::Any aGlobs;
+diff --git sw/source/ui/app/docsh.cxx sw/source/ui/app/docsh.cxx
+index dd2f32d..87553e4 100644
+--- sw/source/ui/app/docsh.cxx
++++ sw/source/ui/app/docsh.cxx
+@@ -162,6 +162,7 @@
+ #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+ 
+ #include <unomid.h>
++#include "glosdoc.hxx"
+ 
+ using rtl::OUString;
+ using namespace ::com::sun::star;
+@@ -169,6 +170,32 @@ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::script;
+ using namespace ::com::sun::star::container;
+ 
++uno::Reference< container::XNamed >
++SwImportedAutoText::ImportAutoText( const String& sTemplateURL )
++{
++    uno::Reference< container::XNamed > xResult;
++    // see if we already have imported this template
++    std::vector< uno::Reference< container::XNamed > >::iterator it_end = mImportedAutotext.end();
++    rtl::OUString sGroupName = SwTransientGlossaries::GetTransientImportedGlossaries().GetGroupName( sTemplateURL );
++
++    for ( std::vector< uno::Reference< container::XNamed > >::iterator it = mImportedAutotext.begin(); it != it_end; ++it )
++    {
++        if ( (*it)->getName().equals( sGroupName ) )
++        {
++            xResult = (*it);
++            break; 
++        } 
++    }
++    if ( !xResult.is() )
++    {    
++        OSL_TRACE("Attempting import of autotext");
++        xResult =SwTransientGlossaries::GetTransientImportedGlossaries().Import( sTemplateURL );
++        if ( xResult.is() )
++            mImportedAutotext.push_back( xResult );
++        OSL_TRACE("after import of autotext");
++    }
++    return xResult;
++}
+ 
+ SFX_IMPL_INTERFACE( SwDocShell, SfxObjectShell, SW_RES(0) )
+ {
+diff --git sw/source/ui/inc/glosdoc.hxx sw/source/ui/inc/glosdoc.hxx
+index 355078b..9a0273c 100644
+--- sw/source/ui/inc/glosdoc.hxx
++++ sw/source/ui/inc/glosdoc.hxx
+@@ -50,7 +50,9 @@ SV_DECL_REF( SwDocShell )
+ #define INCLUDED_VECTOR
+ #endif
+ #include "swdllapi.h"
+-
++#include <osl/mutex.hxx>
++#include <com/sun/star/container/XNamed.hpp>
++#include <hash_map>
+ typedef ::com::sun::star::uno::WeakReference< ::com::sun::star::text::XAutoTextGroup > AutoTextGroupRef;
+ typedef ::std::vector< AutoTextGroupRef > UnoAutoTextGroups;
+ 
+@@ -62,6 +64,7 @@ typedef ::std::vector< AutoTextEntryRef > UnoAutoTextEntries;
+ // CLASS -----------------------------------------------------------------
+ class SW_DLLPUBLIC SwGlossaries
+ {
++protected:
+     UnoAutoTextGroups       m_aGlossaryGroups;
+     UnoAutoTextEntries      m_aGlossaryEntries;
+ 
+@@ -71,6 +74,7 @@ class SW_DLLPUBLIC SwGlossaries
+     SvStrings               *m_pPathArr;
+     SvStrings               *m_pGlosArr;
+     BOOL                    m_bError;
++	void			UpdateGlosPath(BOOL bFull, const String& rPath );
+ 
+     SW_DLLPRIVATE SwTextBlocks*	GetGlosDoc(const String &rName, BOOL bCreate = TRUE) const;
+     SW_DLLPRIVATE SvStrings	    *GetNameList();
+@@ -146,6 +150,26 @@ public:
+     inline ULONG    IsGlosPathErr() { return m_bError; }
+     const SvStrings*    GetPathArray() const {return m_pPathArr;}
+ };
+-
++typedef std::vector< ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNamed >  > GlossGroups;
++typedef  std::hash_map< rtl::OUString, rtl::OUString, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > StringMap;
++class SW_DLLPUBLIC SwTransientGlossaries : public SwGlossaries
++{
++	SwTransientGlossaries() throw( com::sun::star::uno::RuntimeException );
++	~SwTransientGlossaries();
++        GlossGroups mGroups;
++        StringMap PathToGroup;
++        StringMap GroupToPath;
++        bool findGroupForPath( StringMap::iterator&, String& );
++        osl::Mutex   m_aMutex; 
++public:
++        com::sun::star::uno::Reference< com::sun::star::container::XNamed > Import( const String& sTemplateURL );
++        void DeleteGroup( const String& sGroupName );
++        String GetGroupName( const String& sTemplateURL );
++        static SwTransientGlossaries& GetTransientImportedGlossaries() throw( com::sun::star::uno::RuntimeException )
++        {
++            static SwTransientGlossaries importedGlossaries;
++            return importedGlossaries;    
++        }
++};
+ 
+ #endif // _GLOSDOC_HXX
+diff --git sw/source/ui/misc/glosdoc.cxx sw/source/ui/misc/glosdoc.cxx
+index a34c374..0647f87 100644
+--- sw/source/ui/misc/glosdoc.cxx
++++ sw/source/ui/misc/glosdoc.cxx
+@@ -62,6 +62,10 @@
+ #ifndef _GLOBALS_HRC
+ #include <globals.hrc>
+ #endif
++#include <comphelper/processfactory.hxx>
++#include <rtl/bootstrap.hxx>
++#include <svx/acorrcfg.hxx>
++#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
+ 
+ using namespace ::com::sun::star;
+ using namespace ::com::sun::star::uno;
+@@ -487,6 +491,10 @@ void SwGlossaries::UpdateGlosPath(sal_Bool bFull)
+ {
+     SvtPathOptions aPathOpt;
+     String aNewPath( aPathOpt.GetAutoTextPath() );
++}
++
++void SwGlossaries::UpdateGlosPath(sal_Bool bFull, const String& aNewPath )
++{
+     sal_Bool bPathChanged = m_aPath != aNewPath;
+     if (bFull || bPathChanged)
+     {
+@@ -805,5 +813,183 @@ Reference< text::XAutoTextEntry > SwGlossaries::GetAutoTextEntry( const String&
+     return xReturn;
+ }
+ 
++SwTransientGlossaries::SwTransientGlossaries() throw ( uno::RuntimeException ) : SwGlossaries()
++{
++    rtl::OUString sTransientPath =  rtl::OUString::createFromAscii("${$BRAND_BASE_DIR/program/") + rtl::OUString::createFromAscii( SAL_CONFIGFILE( "bootstrap" ) ) + rtl::OUString::createFromAscii("::UserInstallation}/user/temp/autotext");
++
++    rtl::Bootstrap::expandMacros( sTransientPath );
++    uno::Reference< lang::XMultiServiceFactory > xMCF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
++    Reference< ucb::XSimpleFileAccess > xSFA( xMCF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW );
++
++    if ( !xSFA->exists( sTransientPath ) )
++           xSFA->createFolder( sTransientPath ); // will throw if is fails
++
++    else if ( !xSFA->isFolder( sTransientPath ) )
++        throw uno::RuntimeException(); // something very wrong, temp/autotext exists but isn't a folder
++    // ok we have the folder but maybe there is some stale content 
++    // ( after a crash maybe? ) so, attempt to empty it
++    uno::Sequence< rtl::OUString > sDirEntries = xSFA->getFolderContents( sTransientPath, sal_False );
++    sal_Int32 nItems = sDirEntries.getLength();
++    for ( sal_Int32 index = 0; index < nItems; ++index )
++    {
++        rtl::OUString sItem( sDirEntries[ index ] );
++        sal_Int32 nDot = sItem.lastIndexOf('.');
++        if ( nDot > -1 )
++        {
++            rtl::OUString sExt = sDirEntries[ index ].copy( nDot + 1 );
++            if ( sExt.equalsIgnoreAsciiCase( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("bau") ) ) )
++            {
++                try
++                {
++                   xSFA->kill( sItem );
++                }
++                catch( uno::Exception& )
++                {
++                }
++            }
++        }
++    } 
++    UpdateGlosPath( true, sTransientPath ); 
++}
++
++
++SwTransientGlossaries::~SwTransientGlossaries()
++{
++}
++
++bool SwTransientGlossaries::findGroupForPath( StringMap::iterator& it, String& sName  )
++{
++    
++    it = GroupToPath.find( sName );
++    return ( it != PathToGroup.end() );
++}
++
++String SwTransientGlossaries::GetGroupName( const String& sTemplateURL )
++{
++    ::osl::MutexGuard aGuard( m_aMutex );
++    INetURLObject aURL( sTemplateURL );
++    String sGroupName = aURL.GetLastName();     
++    aURL.CutLastName();
++    rtl::OUString sPath = aURL.GetURLPath();
++    StringMap::iterator it = PathToGroup.find( sPath );
++    if ( it != PathToGroup.end() )
++    {
++        // we already have a group for this path
++        String sName( it->second );
++        // append delimiter
++        sName.AppendAscii("*0");
++        return sName;
++    }
++    // create new groupName
++    sGroupName = sGroupName.GetToken( 0, '.' );
++    sal_Int32 index = 0;
++
++    // we need to do a reverse lookup to ensure that the groupname is
++    // not already used ( for a different path ) 
++    while ( findGroupForPath( it, sGroupName ) )
++        sGroupName += String::CreateFromInt32( ++index ); 
++
++    PathToGroup[ sPath ] = sGroupName;     
++    GroupToPath[ sGroupName ] = sPath;
++
++    sGroupName.AppendAscii("*0");
++   
++    
++    return sGroupName;
++}
++
++typedef  cppu::WeakImplHelper1< container::XNamed > GroupWrapperBASE;
++Reader* GetWW8Reader();
++class GroupWrapper : public GroupWrapperBASE
++{
++    rtl::OUString msName;
++public:
++    GroupWrapper( const rtl::OUString& sName ) : msName( sName )
++    {
++        OSL_TRACE(" *** creating GroupWrapper %s", rtl::OUStringToOString( msName, RTL_TEXTENCODING_UTF8 ).getStr() );
++    }
++    ~GroupWrapper()
++    {
++        OSL_TRACE(" *** deleting GroupWrapper %s", rtl::OUStringToOString( msName, RTL_TEXTENCODING_UTF8 ).getStr() );
++        // nothing holding a Group, delete it
++        SwTransientGlossaries::GetTransientImportedGlossaries().DeleteGroup( msName );
++    }
++    virtual ::rtl::OUString SAL_CALL getName() throw (uno::RuntimeException)
++    {
++        return msName;
++    }
++    virtual void SAL_CALL setName( const ::rtl::OUString& aName ) throw (uno::RuntimeException) 
++    {
++        throw uno::RuntimeException(); // not supported
++    }
++};
+ 
++void SwTransientGlossaries::DeleteGroup( const String& sGroupName )
++{
++    ::osl::MutexGuard aGuard( m_aMutex );
++    StringMap::iterator it = PathToGroup.find( sGroupName );
++    if ( it != PathToGroup.end() )
++        PathToGroup.erase( it );
++    if ( it != GroupToPath.end() )
++        GroupToPath.erase( it );
++    DelGroupDoc( sGroupName );
++}
++uno::Reference< container::XNamed > SwTransientGlossaries::Import( const String& sTemplateURL )
++{
++    ::osl::MutexGuard aGuard( m_aMutex );
++    uno::Reference< container::XNamed > xRet;
++    String sGroupName = GetGroupName( sTemplateURL );
++    OSL_TRACE("** attempt to open %s", rtl::OUStringToOString( sTemplateURL, RTL_TEXTENCODING_UTF8 ).getStr() );
++    if( sGroupName.Len() )
++    {
++        // first see if we have a reference to this
++        GlossGroups::iterator it_end = mGroups.end();
++        for( GlossGroups::iterator it = mGroups.begin(); it != it_end; ++it )
++        {
++            xRet.set( (*it).get(), uno::UNO_QUERY ) ;
++            if ( xRet.is() )
++            {
++                if ( xRet->getName().equals( sGroupName ) )
++                {         
++                    OSL_TRACE("** Found autotext for %s in cache", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
++                    return xRet;
++                } 
++            }
++            else
++                mGroups.erase( it ); // lost reference to the group
++        }
++        const SfxFilter* pFilter = 0;
++        std::auto_ptr< SfxMedium > pMed( new SfxMedium( sTemplateURL, STREAM_READ, TRUE, 0, 0 ) );
++        SfxFilterMatcher aMatcher( String::CreateFromAscii("swriter") );
++        pMed->UseInteractionHandler( FALSE );
++        if( !aMatcher.GuessFilter( *pMed, &pFilter, FALSE ) )
++        {
++            pMed->SetFilter( pFilter );
++            std::auto_ptr< Reader > pR( ::GetWW8Reader() );
++            // should test if equal to ascii defined by FILTER_WW8 
++            if ( pR.get() && pFilter->GetUserData() == String( RTL_CONSTASCII_USTRINGPARAM( FILTER_WW8 ) ) )
++            {
++                pR->SetFltName( pFilter->GetUserData()  );
++                OSL_TRACE("GroupName is %s", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
+ 
++                SwTextBlocks *pGlossary = GetGroupDoc( sGroupName, true );
++                if( pR.get() && pGlossary )
++                {
++                    SwReader aReader( *pMed, sTemplateURL );
++                    if( aReader.HasGlossaries( *pR ) )
++                    {
++                        const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
++                        if ( aReader.ReadGlossaries( *pR, *pGlossary, pCfg->IsSaveRelFile() ) )
++                        {
++                            xRet = new GroupWrapper( sGroupName );
++                            mGroups.push_back( xRet ); // cache file and object
++                        }
++                        else
++                            OSL_TRACE("*** Reader says no glossaries!!");
++                    }
++                }
++            }
++        }
++    }
++    return xRet;
++}
+diff --git sw/source/ui/uno/unoatxt.cxx sw/source/ui/uno/unoatxt.cxx
+index 210b784..6d002cd 100644
+--- sw/source/ui/uno/unoatxt.cxx
++++ sw/source/ui/uno/unoatxt.cxx
+@@ -70,7 +70,44 @@
+ SV_IMPL_REF ( SwDocShell )
+ using namespace ::com::sun::star;
+ using ::rtl::OUString;
++class SwImportedAutoTextContainer : public SwXAutoTextContainer
++{
++    virtual ~SwImportedAutoTextContainer();
++public:
++    SwImportedAutoTextContainer();
++};
++
++uno::Reference< uno::XInterface > SAL_CALL SwImportedAutoTextContainer_createInstance(
++    const uno::Reference< lang::XMultiServiceFactory > & ) throw( uno::Exception )
++{
++    //the module may not be loaded
++    ::vos::OGuard aGuard(Application::GetSolarMutex());
++    SwDLL::Init();
++    static uno::Reference< uno::XInterface > xAText = (cppu::OWeakObject*)new SwImportedAutoTextContainer();;
++    return xAText;
++}
++
++uno::Sequence< OUString > SAL_CALL SwImportedAutoTextContainer_getSupportedServiceNames() throw()
++{
++    OUString sService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ImportedAutoTextContainer"));
++    const uno::Sequence< OUString > aSeq( &sService, 1 );
++    return aSeq;
++}
++
++OUString SAL_CALL SwImportedAutoTextContainer_getImplementationName() throw()
++{
++    return OUString( RTL_CONSTASCII_USTRINGPARAM("SwImportedAutoTextContainer" ) );
++}
+ 
++SwImportedAutoTextContainer::SwImportedAutoTextContainer()
++{
++    pGlossaries = &SwTransientGlossaries::GetTransientImportedGlossaries();
++}
++
++SwImportedAutoTextContainer::~SwImportedAutoTextContainer()
++{
++
++}
+ /******************************************************************
+  *
+  ******************************************************************/
+diff --git sw/source/ui/uno/unofreg.cxx sw/source/ui/uno/unofreg.cxx
+index 50e7709..cdb66d6 100644
+--- sw/source/ui/uno/unofreg.cxx
++++ sw/source/ui/uno/unofreg.cxx
+@@ -119,6 +119,10 @@ extern uno::Sequence< OUString > SAL_CALL SwXAutoTextContainer_getSupportedServi
+ extern OUString SAL_CALL SwXAutoTextContainer_getImplementationName() throw();
+ extern uno::Reference< uno::XInterface > SAL_CALL SwXAutoTextContainer_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
+ 
++extern uno::Sequence< OUString > SAL_CALL SwImportedAutoTextContainer_getSupportedServiceNames() throw();
++extern OUString SAL_CALL SwImportedAutoTextContainer_getImplementationName() throw();
++extern uno::Reference< uno::XInterface > SAL_CALL SwImportedAutoTextContainer_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
++
+ extern uno::Sequence< OUString > SAL_CALL SwXModule_getSupportedServiceNames() throw();
+ extern OUString SAL_CALL SwXModule_getImplementationName() throw();
+ extern uno::Reference< uno::XInterface > SAL_CALL SwXModule_createInstance(const uno::Reference< XMultiServiceFactory > & rSMgr) throw( uno::Exception );
+@@ -216,6 +220,8 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
+             //API objects
+             lcl_uno_writeInfo( pKey, SwXAutoTextContainer_getImplementationName(),
+                                SwXAutoTextContainer_getSupportedServiceNames() );
++            lcl_uno_writeInfo( pKey, SwImportedAutoTextContainer_getImplementationName(),
++                               SwImportedAutoTextContainer_getSupportedServiceNames() );
+             lcl_uno_writeInfo( pKey, SwXModule_getImplementationName(),
+                                SwXModule_getSupportedServiceNames() );
+             lcl_uno_writeInfo( pKey, SwXMailMerge_getImplementationName(),
+@@ -400,6 +406,15 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
+                 SwXAutoTextContainer_createInstance,
+                 SwXAutoTextContainer_getSupportedServiceNames() );
+         }
++        else if( SwImportedAutoTextContainer_getImplementationName().equalsAsciiL(
++                                                    pImplName, nImplNameLen ) )
++        {
++            xFactory = ::cppu::createSingleFactory( xMSF,
++                SwImportedAutoTextContainer_getImplementationName(),
++                SwImportedAutoTextContainer_createInstance,
++                SwImportedAutoTextContainer_getSupportedServiceNames() );
++        }
++
+         else if( SwXModule_getImplementationName().equalsAsciiL(
+                                                     pImplName, nImplNameLen ) )
+         {
+diff --git sw/source/ui/vba/vbadocument.cxx sw/source/ui/vba/vbadocument.cxx
+index 1090a8b..f82b69c 100644
+--- sw/source/ui/vba/vbadocument.cxx
++++ sw/source/ui/vba/vbadocument.cxx
+@@ -245,7 +245,7 @@ SwVbaDocument::getAttachedTemplate() throw (uno::RuntimeException)
+     uno::Reference< document::XDocumentProperties > xDocProps( xDocPropSupp->getDocumentProperties(), uno::UNO_QUERY_THROW );
+     rtl::OUString sTemplateName = xDocProps->getTemplateName();
+ 
+-    xTemplate = new SwVbaTemplate( this, mxContext, getModel(), sTemplateName );
++    xTemplate = new SwVbaTemplate( this, mxContext, getModel(), sTemplateName, xDocProps->getTemplateURL() );
+     return uno::makeAny( xTemplate );
+ }
+ 
+diff --git sw/source/ui/vba/vbatemplate.cxx sw/source/ui/vba/vbatemplate.cxx
+index 9413428..485a864 100644
+--- sw/source/ui/vba/vbatemplate.cxx
++++ sw/source/ui/vba/vbatemplate.cxx
+@@ -33,12 +33,12 @@
+ #include "vbaautotextentry.hxx"
+ #include <comphelper/processfactory.hxx>
+ #include <com/sun/star/text/XAutoTextContainer.hpp>
+-
++#include <docsh.hxx>
+ using namespace ::ooo::vba;
+ using namespace ::com::sun::star;
+ 
+-SwVbaTemplate::SwVbaTemplate( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& rName )
+-    : SwVbaTemplate_BASE( rParent, rContext ), mxModel( rModel ), msName( rName )
++SwVbaTemplate::SwVbaTemplate( const uno::Reference< ooo::vba::XHelperInterface >& rParent, const uno::Reference< uno::XComponentContext >& rContext, const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& rName, const rtl::OUString& rURL )
++    : SwVbaTemplate_BASE( rParent, rContext ), mxModel( rModel ), msName( rName ), msURL( rURL )
+ {
+ }
+ 
+@@ -57,16 +57,14 @@ uno::Any SAL_CALL
+ SwVbaTemplate::AutoTextEntries( const uno::Any& index ) throw (uno::RuntimeException)
+ {
+     uno::Reference< lang::XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory();
+-    uno::Reference< text::XAutoTextContainer > xAutoTextContainer( xMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.AutoTextContainer") ) ), uno::UNO_QUERY_THROW );
++    uno::Reference< text::XAutoTextContainer > xAutoTextContainer( xMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ImportedAutoTextContainer") ) ), uno::UNO_QUERY_THROW );
++    
++    SwDocShell* pDocShell = word::getDocShell( mxModel );
+ 
+-    // the default template is "Normal.dot" in Word.
+-    rtl::OUString sGroup( RTL_CONSTASCII_USTRINGPARAM("Normal") );
+-    if( sal_Int32 nIndex = msName.lastIndexOf( sal_Unicode('.') ) > 0 )
+-    {
+-        sGroup = msName.copy( 0, msName.lastIndexOf( sal_Unicode('.') ) );
+-       // OSL_TRACE("SwVbaTemplate::AutoTextEntries: %s", rtl::OUStringToOString( sGroup, RTL_TEXTENCODING_UTF8 ).getStr() );
+-    }
++    uno::Reference< container::XNamed > xGroupName( pDocShell->AutoTextImporter().ImportAutoText( msURL ), uno::UNO_QUERY_THROW );
+     
++    rtl::OUString sGroup = xGroupName->getName();
++
+     uno::Reference< container::XIndexAccess > xGroup;
+     if( xAutoTextContainer->hasByName( sGroup ) )
+     {
+diff --git sw/source/ui/vba/vbatemplate.hxx sw/source/ui/vba/vbatemplate.hxx
+index df8848b..84caaf0 100644
+--- sw/source/ui/vba/vbatemplate.hxx
++++ sw/source/ui/vba/vbatemplate.hxx
+@@ -40,9 +40,10 @@ class SwVbaTemplate : public SwVbaTemplate_BASE
+ private:
+     css::uno::Reference< css::frame::XModel > mxModel;
+     rtl::OUString msName;
++    rtl::OUString msURL;
+ public:
+ 	SwVbaTemplate( const css::uno::Reference< ooo::vba::XHelperInterface >& rParent, const css::uno::Reference< css::uno::XComponentContext >& rContext, 
+-        const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString& );
++        const css::uno::Reference< css::frame::XModel >& rModel, const rtl::OUString&, const rtl::OUString& );
+ 	virtual ~SwVbaTemplate();
+ 
+    // XTemplate


More information about the ooo-build-commit mailing list