[ooo-build-commit] doc/vba-autotext-notes.txt
Noel Power
noelp at kemper.freedesktop.org
Tue Jul 28 08:11:00 PDT 2009
doc/vba-autotext-notes.txt | 296 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 296 insertions(+)
New commits:
commit 20fe8a46539ff84c3d7a0eee2b77e21dc586f8b2
Author: Noel Power <noel.power at novell.com>
Date: Tue Jul 28 16:09:17 2009 +0100
some notes about ideas how to get access autotext on import
* doc/vba-autotext-notes.txt:
diff --git a/doc/vba-autotext-notes.txt b/doc/vba-autotext-notes.txt
new file mode 100644
index 0000000..376a308
--- /dev/null
+++ b/doc/vba-autotext-notes.txt
@@ -0,0 +1,296 @@
+in openoffice autotext is implemented by the the service
+"com.sun.star.text.AutoTextContainer"
+
+the autotext entries can exist from
+a) existing autotext created via the ui ( or api )
+b) imported autotext from mso documents
+
+the "com.sun.star.text.AutoTextContainer" is implemented in sw/source/ui/uno/unoatxt.cxx ( it is a singleton )
+
+SwXAutoTextContainer::SwXAutoTextContainer()
+ accesses the saved on disk autotext via ::GetGlossaries() ( defined in sw/source/ui/utlui/initui.cxx )
+ GetGlossaries sw/source/ui/misc/glosdoc.cxx
+
+
+the autodoc is contained in an xml format ( zipped )
+a Group and items withing the groups where the Groups is an special zip file, each item is a directory in that (zip) file.
+
+We need ( I guess ) to be able to create transient Groups that represent the documents currently ( loaded ) and additionally and global templates ( from a specified location ? ) or I guess any template ( we can see ) that is referenced
+
+this looks like quite a bit of work, on start-up I guess we need to import any ( global stuff, like from addins or defined global templates ), sounds doable
+
+when opening a document probably if that document references a template we could could ( maybe ) have a reference counted transient group associated with that in the autotext container too ?
+
+getting a group, container uses ( from sw/source/ui/misc/glosdoc.cxx )
+
+Reference< text::XAutoTextGroup > SwGlossaries::GetAutoTextGroup( const ::rtl::OUString& _rGroupName, bool _bCreate )
+
+
+already cached entries exist in m_aGlossaryGroups, these contain SwXAutoTextGroups ( sw/source/ui/uno/unoatxt.cxx ) objects ( these are the containers/groups for the this individual AutoText objects
+
+on import how are these created :/
+
+( lets debug )
+
+hmm it seems that looking where the uno objects are created doesn't help ( when importing via tha api ) I must have missed the fact that some (existing) internal objects must in fact by wrapped by the uno stuff
+
+... after more searching
+
+the filter parts themselves are more interesting.
+
+(gdb) up
+#1 0xac16f962 in WW8GlossaryFib::WW8GlossaryFib(SvStream&, unsigned char, SvStream&, WW8Fib const&) () from /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/INSTALL_LINK/basis3.1/program/libmswordli.so
+(gdb) up
+#2 0xac16edfb in WW8Glossary (this=0xbfffd1b0, refStrm=@0xbfffd1c4, nVersion=8 '\b', pStg=0x8e161c8) at /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/build/ooo310-m13/sw/source/filter/ww8/ww8glsy.cxx:70
+(gdb) up
+#3 0xac10de21 in WW8Reader::ReadGlossaries(SwTextBlocks&, unsigned char) const () from /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/INSTALL_LINK/basis3.1/program/libmswordli.so
+(gdb) where
+#0 WW8GlossaryFib::FindGlossaryFibOffset (this=0x8efe318, rTableStrm=@0x8ca8338, rStrm=@0x8dfd348, rFib=@0xbfffceb0) at /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/build/ooo310-m13/sw/source/filter/ww8/ww8glsy.cxx:268
+#1 0xac16f962 in WW8GlossaryFib::WW8GlossaryFib(SvStream&, unsigned char, SvStream&, WW8Fib const&) () from /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/INSTALL_LINK/basis3.1/program/libmswordli.so
+#2 0xac16edfb in WW8Glossary (this=0xbfffd1b0, refStrm=@0xbfffd1c4, nVersion=8 '\b', pStg=0x8e161c8) at /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/build/ooo310-m13/sw/source/filter/ww8/ww8glsy.cxx:70
+#3 0xac10de21 in WW8Reader::ReadGlossaries(SwTextBlocks&, unsigned char) const () from /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/INSTALL_LINK/basis3.1/program/libmswordli.so
+#4 0xacdb1a23 in SwReader::ReadGlossaries (this=0xbfffd230, rOptions=@0x8b8cbe8, rBlocks=@0x890dd80, bSaveRelFiles=0 '\0') at /media/disk-1/Openoffice-BUILDS/GIT_AGAIN/ooo-build/build/ooo310-m13/sw/source/filter/basflt/shellio.cxx:708
+#5 0xacf437bc in SwGlossaryHdl::ImportGlossaries(String const&) () from
+
+
+
+ahh, so... the trick is
+
+a) the import is actually done ww8par.cxx BOOL WW8Reader::ReadGlossaries(SwTextBlocks& rBlocks, BOOL bSaveRelFiles) const
+
+rBlocks actually relates to the glossary container ( associated with the template we are importing into ) e.g. rBlocks could be standard, myautotext ( or something ( e.g. a group ) you have created yourself.
+
+SwTextBlocks ( or the group container ) is created from
+ SwGlossaries::GetGroupDoc() ( sw/source/ui/misc/glosdoc.cxx )
+ + SwGlossaries::GetGlosDoc()
+ + creates a SwTextBlocks ( for a file url )
+ + create SwXMLTextBlocks.cxx ( for the url )
+
+sw/source/core/swg/SwXMLTextBlocks.cxx
+
+unfortunately it seems that SwXMLTextBlocks doesn't want to play well with a given storage ( e.g. one that might be in memory ( or attached to the document ) )
+
+assuming we can create an SwTextBlocks ( not associated with a hard file ) on the fly what then?
+
+well, you can create SwXAutoTextGroups from the info ( but really everthing still comes down to hardcoding of use of pGlossaries = ::GetGlossaries(); where pGlossaries is the static list of SwGlossaries.
+
+
+SwXAutoTextContainer uses following public methods (..)
+ pGlossaries->GetGroupCnt();
+ pGlossaries->GetGroupName( static_cast< USHORT >(nIndex) )
+ pGlossaries->GetAutoTextGroup( GroupName, TRUE );
+ String sGroupName( pGlossaries->GetCompleteGroupName( Name ) );
+ pGlossaries->NewGroupDoc(sGroup, sGroup.GetToken(0, GLOS_DELIM));
+ pGlossaries->GetAutoTextGroup( sGroup, true ); ( *** is this all we really need )
+ SwXAutoTextGroup ( requires a SwGlossaries instance ( I guess to provide the SwTextBlocks from GetGroupDoc/GetGlosDoc )
+ String sGroupName = pGlossaries->GetCompleteGroupName( aGroupName );
+ pGlossaries->DelGroupDoc(sGroupName);
+
+SwXAutoTextGroup uses the following SwGlossaries public methods
+ * interestingly this class is passed the global glossaries ptr
+ SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(m_sGroupName, sal_False) : 0;
+ ( but wouldn't it make more sense to just pass in the associated SwTextBlocks ? ) - looks like we would do that
+
+ pGlossaries->PutGroupDoc( pGlosGroup ); ( insert new named autotext into the group )
+ uno::Reference< text::XAutoTextEntry > xEntry = pGlossaries->GetAutoTextEntry( m_sGroupName, sName, sShortName, true );
+ ( again SwXAutoTextEntry requires a SwGlossaries instance )
+
+SwXAutoTextEntry uses the following SwGlossaries public methods
+
+ xDocSh = pGlossaries->EditGroupDoc ( sGroupName, sEntryName, FALSE );
+ wTextBlocks* pBlock = pGlossaries->GetGroupDoc(sGroupName);
+
+
+maybe we can keep the current setup and use a temp dir to store autoimported autotext. we would need
+
+ o a new accessor for this 'special' autotext stuff ( sw/source/ui/utlui/initui.cxx GetTransientImportedGlossaries() perhaps )
+ o additionally we would need probably need to not use HasGlossaryList() & GetGlossaryList() for those imported transient groups ( and disable handling WID_GROUP_TITLE in unoatxt.cxx )
+ o new SwGlossaries => SwTransientImportedGlossaries
+
+
+this could work. SwGlossaries expects groups with this format
+
+groupname*n
+where '*' is a delimiter
+where n is the offset into the path array ( in our case one should be sufficient )
+
+
+so, normally when reading a document we have the autotext from
+ a) all active templates
+ b) this document too ( if it is a template )
+ c) Normal.dot
+ d) later on api can add/delete ( ok this will not be reflected in any MSO template :-/, changes would only be done to the local imported format )
+
+
+One ( simple ) approach would be to try the idea of importing the content from any referenced( global I suppose ) templates on startup ( importing them into local files in a temp directory ( we could delete the contents of the temp directory on startup ) but.... then, how do we handle importing referenced templates ( and multiple instances of imported templates from documents ) not sure what is the best way around that. I guess each document could reference count the imported autotext document that it has. First cut I guess would be to get things working in a "there only is one document ever open world" and then worry about that.
+
+
+small patch just to start, this just basically provides a static class that inherits from the current glossary/autotext document implementation, it allows just a basic import ( no uno-isation or management of the data/stuff yet )
+
+diff --git sw/source/filter/ww8/ww8par.cxx sw/source/filter/ww8/ww8par.cxx
+index 21a8014..d07ea54 100644
+--- sw/source/filter/ww8/ww8par.cxx
++++ sw/source/filter/ww8/ww8par.cxx
+@@ -160,6 +160,8 @@ using namespace nsHdFtFlags;
+ #include <svx/msvbahelper.hxx>
+ #include <svtools/pathoptions.hxx>
+ #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
++#include "../../ui/inc/glosdoc.hxx"
++
+
+ const static String sThisDocument( RTL_CONSTASCII_USTRINGPARAM("ThisDocument"));
+
+@@ -4227,6 +4229,11 @@ ULONG SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos)
+
+ // Read Global templates
+ ReadGlobalTemplateSettings( sCreatedFrom, xPrjNameCache );
++ #if 0
++ // Import autotext from attached template
++ rtl::OUString sAttachedTemplate = rtl::OUString::createFromAscii("file://datat4/home/npower/swedish-police-mallar/Word/rp_ansta.dot" );
++ SwTransientGlossaries::GetTransientImportedGlossaries()->Import( sAttachedTemplate );
++ #endif
+ #endif
+ // Create and insert Word vba Globals
+ uno::Any aGlobs;
+diff --git sw/source/ui/dochdl/gloshdl.cxx sw/source/ui/dochdl/gloshdl.cxx
+index c40ad9f..277ec8e 100644
+--- sw/source/ui/dochdl/gloshdl.cxx
++++ sw/source/ui/dochdl/gloshdl.cxx
+@@ -970,6 +970,9 @@ BOOL SwGlossaryHdl::ImportGlossaries( const String& rName )
+ }
+ DELETEZ(pMed);
+ }
++ OSL_TRACE("Trying my funny import");
++ rtl::OUString sAttachedTemplate = rtl::OUString::createFromAscii("file:///data4/home/npower/swedish-police-mallar/Word/rp_ansta.dot" );
++ SwTransientGlossaries::GetTransientImportedGlossaries()->Import( sAttachedTemplate );
+ return bRet;
+ }
+
+diff --git sw/source/ui/inc/glosdoc.hxx sw/source/ui/inc/glosdoc.hxx
+index ebb7eba..6ca4e52 100644
+--- sw/source/ui/inc/glosdoc.hxx
++++ sw/source/ui/inc/glosdoc.hxx
+@@ -62,6 +62,7 @@ typedef ::std::vector< AutoTextEntryRef > UnoAutoTextEntries;
+ // CLASS -----------------------------------------------------------------
+ class SW_DLLPUBLIC SwGlossaries
+ {
++protected:
+ UnoAutoTextGroups m_aGlossaryGroups;
+ UnoAutoTextEntries m_aGlossaryEntries;
+
+@@ -71,6 +72,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();
+@@ -81,7 +83,7 @@ class SW_DLLPUBLIC SwGlossaries
+
+ public:
+ SwGlossaries();
+- ~SwGlossaries();
++ virtual ~SwGlossaries();
+
+ /** returns the cached AutoTextGroup (if any) for the given group name
+
+@@ -147,5 +149,18 @@ public:
+ const SvStrings* GetPathArray() const {return m_pPathArr;}
+ };
+
++class SW_DLLPUBLIC SwTransientGlossaries : public SwGlossaries
++{
++protected:
++ SwTransientGlossaries();
++ ~SwTransientGlossaries();
++public:
++ bool Import( const String& sTemplate );
++ static SwTransientGlossaries* GetTransientImportedGlossaries()
++ {
++ static SwTransientGlossaries importedGlossaries;
++ return &importedGlossaries;
++ }
++};
+
+ #endif // _GLOSDOC_HXX
+diff --git sw/source/ui/misc/glosdoc.cxx sw/source/ui/misc/glosdoc.cxx
+index cf5cb88..226fcdd 100644
+--- sw/source/ui/misc/glosdoc.cxx
++++ sw/source/ui/misc/glosdoc.cxx
+@@ -62,7 +62,8 @@
+ #ifndef _GLOBALS_HRC
+ #include <globals.hrc>
+ #endif
+-
++#include <rtl/bootstrap.hxx>
++#include <svx/acorrcfg.hxx>
+ using namespace ::com::sun::star;
+ using namespace ::com::sun::star::uno;
+
+@@ -487,6 +488,10 @@ void SwGlossaries::UpdateGlosPath(sal_Bool bFull)
+ {
+ SvtPathOptions aPathOpt;
+ String aNewPath( aPathOpt.GetAutoTextPath() );
++ UpdateGlosPath( bFull, aNewPath );
++}
++void SwGlossaries::UpdateGlosPath(sal_Bool bFull, const String& aNewPath )
++{
+ sal_Bool bPathChanged = m_aPath != aNewPath;
+ if (bFull || bPathChanged)
+ {
+@@ -805,5 +810,54 @@ Reference< text::XAutoTextEntry > SwGlossaries::GetAutoTextEntry( const String&
+ return xReturn;
+ }
+
++SwTransientGlossaries::SwTransientGlossaries() : SwGlossaries()
++{
++ rtl::OUString sTransientPath = rtl::OUString::createFromAscii("${$BRAND_BASE_DIR/program/") + rtl::OUString::createFromAscii( SAL_CONFIGFILE( "bootstrap" ) ) + rtl::OUString::createFromAscii("::UserInstallation}/user/temp/");
++ rtl::Bootstrap::expandMacros( sTransientPath );
++ OSL_TRACE("******* expanded url is %s", rtl::OUStringToOString( sTransientPath, RTL_TEXTENCODING_UTF8 ).getStr() );
++ UpdateGlosPath( true, sTransientPath );
++}
++
+
++SwTransientGlossaries::~SwTransientGlossaries()
++{
++}
+
++bool SwTransientGlossaries::Import( const String& sTemplateURL )
++{
++ bool bRet = false;
++ if( sTemplateURL.Len() )
++ {
++ const SfxFilter* pFilter = 0;
++ //std::auto_ptr< SfxMedium > pMed( new SfxMedium( sTemplateURL, STREAM_READ, TRUE, 0, 0 ) );
++ 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 );
++ Reader* pR = SwReaderWriter::GetReader( pFilter->GetUserData() );
++ INetURLObject aURL( sTemplateURL );
++ String sGroupName = aURL.GetLastName();
++ sGroupName = sGroupName.GetToken( 0, '.' );
++
++ sGroupName.AppendAscii("*0");
++ OSL_TRACE("GroupName is %s", rtl::OUStringToOString( sGroupName, RTL_TEXTENCODING_UTF8 ).getStr() );
++
++ SwTextBlocks *pGlossary = GetGroupDoc( sGroupName, true );
++ if( pR && pGlossary )
++ {
++ SwReader aReader( *pMed, sTemplateURL );
++ if( aReader.HasGlossaries( *pR ) )
++ {
++ const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
++ bRet = aReader.ReadGlossaries( *pR, *pGlossary,
++ pCfg->IsSaveRelFile() );
++ }
++ }
++ }
++ DELETEZ(pMed);
++
++ }
++ return bRet;
++}
More information about the ooo-build-commit
mailing list