1*efeef26fSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*efeef26fSAndrew Rist * distributed with this work for additional information 6*efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*efeef26fSAndrew Rist * "License"); you may not use this file except in compliance 9*efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*efeef26fSAndrew Rist * software distributed under the License is distributed on an 15*efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*efeef26fSAndrew Rist * KIND, either express or implied. See the License for the 17*efeef26fSAndrew Rist * specific language governing permissions and limitations 18*efeef26fSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*efeef26fSAndrew Rist *************************************************************/ 21*efeef26fSAndrew Rist 22*efeef26fSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sw.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <memory> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #define _SVSTDARR_STRINGS 32cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <svl/svstdarr.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #ifndef __RSC //autogen 37cdf0e10cSrcweir #include <tools/errinf.hxx> 38cdf0e10cSrcweir #endif 39cdf0e10cSrcweir #include <tools/debug.hxx> 40cdf0e10cSrcweir #include <svl/urihelper.hxx> 41cdf0e10cSrcweir #ifndef SVTOOLS_FSTATHELPER_HXX 42cdf0e10cSrcweir #include <svl/fstathelper.hxx> 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir #include <unotools/pathoptions.hxx> 45cdf0e10cSrcweir #include <unotools/tempfile.hxx> 46cdf0e10cSrcweir #include <swtypes.hxx> 47cdf0e10cSrcweir #include <errhdl.hxx> // ASSERT 48cdf0e10cSrcweir #include <uitool.hxx> 49cdf0e10cSrcweir #include <glosdoc.hxx> 50cdf0e10cSrcweir #include <shellio.hxx> 51cdf0e10cSrcweir #include <swunohelper.hxx> 52cdf0e10cSrcweir 53cdf0e10cSrcweir #include <unoatxt.hxx> 54cdf0e10cSrcweir #include <swerror.h> 55cdf0e10cSrcweir #ifndef _GLOBALS_HRC 56cdf0e10cSrcweir #include <globals.hrc> 57cdf0e10cSrcweir #endif 58cdf0e10cSrcweir 59cdf0e10cSrcweir using namespace ::com::sun::star; 60cdf0e10cSrcweir using namespace ::com::sun::star::uno; 61cdf0e10cSrcweir 62cdf0e10cSrcweir 63cdf0e10cSrcweir // PUBLIC METHODES ------------------------------------------------------- 64cdf0e10cSrcweir /* -----------------------------08.02.00 15:54-------------------------------- 65cdf0e10cSrcweir 66cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 67cdf0e10cSrcweir String lcl_CheckFileName( const String& rNewFilePath, 68cdf0e10cSrcweir const String& rNewGroupName ) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir String sRet; 71cdf0e10cSrcweir //group name should contain only A-Z and a-z and spaces 72cdf0e10cSrcweir for( xub_StrLen i = 0; i < rNewGroupName.Len(); i++ ) 73cdf0e10cSrcweir { 74cdf0e10cSrcweir sal_Unicode cChar = rNewGroupName.GetChar(i); 75cdf0e10cSrcweir if( (cChar >= 'A' && cChar <= 'Z') || 76cdf0e10cSrcweir (cChar >= 'a' && cChar <= 'z') || 77cdf0e10cSrcweir (cChar >= '0' && cChar <= '9') || 78cdf0e10cSrcweir cChar == '_' || cChar == 0x20 ) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir sRet += cChar; 81cdf0e10cSrcweir } 82cdf0e10cSrcweir } 83cdf0e10cSrcweir sRet.EraseLeadingChars(); 84cdf0e10cSrcweir sRet.EraseTrailingChars(); 85cdf0e10cSrcweir 86cdf0e10cSrcweir sal_Bool bOk = sal_False; 87cdf0e10cSrcweir if( sRet.Len() ) 88cdf0e10cSrcweir { 89cdf0e10cSrcweir String sTmpDir(rNewFilePath); 90cdf0e10cSrcweir sTmpDir += INET_PATH_TOKEN; 91cdf0e10cSrcweir sTmpDir += sRet; 92cdf0e10cSrcweir sTmpDir += SwGlossaries::GetExtension(); 93cdf0e10cSrcweir bOk = !FStatHelper::IsDocument( sTmpDir ); 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir if( !bOk ) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir String rSG = SwGlossaries::GetExtension(); 99cdf0e10cSrcweir //generate generic name 100cdf0e10cSrcweir utl::TempFile aTemp( 101cdf0e10cSrcweir String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "group" )), 102cdf0e10cSrcweir &rSG, &rNewFilePath ); 103cdf0e10cSrcweir aTemp.EnableKillingFile(); 104cdf0e10cSrcweir 105cdf0e10cSrcweir INetURLObject aTempURL( aTemp.GetURL() ); 106cdf0e10cSrcweir sRet = aTempURL.GetBase(); 107cdf0e10cSrcweir } 108cdf0e10cSrcweir return sRet; 109cdf0e10cSrcweir } 110cdf0e10cSrcweir /*------------------------------------------------------------------------ 111cdf0e10cSrcweir Beschreibung: Liefert den Namen der Default-Gruppe 112cdf0e10cSrcweir ------------------------------------------------------------------------*/ 113cdf0e10cSrcweir 114cdf0e10cSrcweir 115cdf0e10cSrcweir String SwGlossaries::GetDefName() 116cdf0e10cSrcweir { 117cdf0e10cSrcweir return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "standard" )); 118cdf0e10cSrcweir 119cdf0e10cSrcweir } 120cdf0e10cSrcweir /*------------------------------------------------------------------------ 121cdf0e10cSrcweir Beschreibung: Liefert die Anzahl der Textbausteingruppen 122cdf0e10cSrcweir ------------------------------------------------------------------------*/ 123cdf0e10cSrcweir 124cdf0e10cSrcweir 125cdf0e10cSrcweir sal_uInt16 SwGlossaries::GetGroupCnt() 126cdf0e10cSrcweir { 127cdf0e10cSrcweir return GetNameList()->Count(); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir /*------------------------------------------------------------------------ 130cdf0e10cSrcweir Beschreibung: Liefert den Gruppennamen 131cdf0e10cSrcweir ------------------------------------------------------------------------*/ 132cdf0e10cSrcweir sal_Bool SwGlossaries::FindGroupName(String & rGroup) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir // enthaelt der Gruppenname keinen Pfad, kann hier ein passender 135cdf0e10cSrcweir // Gruppeneintrag gesucht werden; 136cdf0e10cSrcweir sal_uInt16 nCount = GetGroupCnt(); 137cdf0e10cSrcweir sal_uInt16 i; 138cdf0e10cSrcweir for(i= 0; i < nCount; i++) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir String sTemp(GetGroupName(i)); 141cdf0e10cSrcweir if(rGroup.Equals( sTemp.GetToken(0, GLOS_DELIM))) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir rGroup = sTemp; 144cdf0e10cSrcweir return sal_True; 145cdf0e10cSrcweir } 146cdf0e10cSrcweir } 147cdf0e10cSrcweir //man darf zweimal suchen, denn bei mehreren Verzeichnissen koennte 148cdf0e10cSrcweir //der caseinsensitive Name mehrfach auftreten 149cdf0e10cSrcweir const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore(); 150cdf0e10cSrcweir for(i = 0; i < nCount; i++) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir String sTemp( GetGroupName( i )); 153cdf0e10cSrcweir sal_uInt16 nPath = (sal_uInt16)sTemp.GetToken(1, GLOS_DELIM).ToInt32(); 154cdf0e10cSrcweir 155cdf0e10cSrcweir if( !SWUnoHelper::UCB_IsCaseSensitiveFileName( *(*m_pPathArr)[nPath] ) 156cdf0e10cSrcweir && rSCmp.isEqual( rGroup, sTemp.GetToken( 0, GLOS_DELIM) ) ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir rGroup = sTemp; 159cdf0e10cSrcweir return sal_True; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir } 162cdf0e10cSrcweir return sal_False; 163cdf0e10cSrcweir } 164cdf0e10cSrcweir /* --------------------------------------------------------------------------- 165cdf0e10cSrcweir 166cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 167cdf0e10cSrcweir 168cdf0e10cSrcweir String SwGlossaries::GetGroupName(sal_uInt16 nGroupId) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir ASSERT(nGroupId < m_pGlosArr->Count(), Textbausteinarray ueberindiziert); 171cdf0e10cSrcweir return *(*m_pGlosArr)[nGroupId]; 172cdf0e10cSrcweir } 173cdf0e10cSrcweir /* -----------------------------08.02.00 13:04-------------------------------- 174cdf0e10cSrcweir 175cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 176cdf0e10cSrcweir String SwGlossaries::GetGroupTitle( const String& rGroupName ) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir String sRet; 179cdf0e10cSrcweir String sGroup(rGroupName); 180cdf0e10cSrcweir if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM)) 181cdf0e10cSrcweir FindGroupName(sGroup); 182cdf0e10cSrcweir SwTextBlocks* pGroup = GetGroupDoc(sGroup, sal_False); 183cdf0e10cSrcweir if(pGroup) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir sRet = pGroup->GetName(); 186cdf0e10cSrcweir PutGroupDoc( pGroup ); 187cdf0e10cSrcweir } 188cdf0e10cSrcweir return sRet; 189cdf0e10cSrcweir } 190cdf0e10cSrcweir 191cdf0e10cSrcweir /*------------------------------------------------------------------------ 192cdf0e10cSrcweir Beschreibung: Liefert das Textbaustein-Dokument der Gruppe rName 193cdf0e10cSrcweir ------------------------------------------------------------------------*/ 194cdf0e10cSrcweir 195cdf0e10cSrcweir SwTextBlocks* SwGlossaries::GetGroupDoc(const String &rName, 196cdf0e10cSrcweir sal_Bool bCreate) const 197cdf0e10cSrcweir { 198cdf0e10cSrcweir // gfs. in die Liste der Textbausteine eintragen 199cdf0e10cSrcweir if(bCreate && m_pGlosArr) 200cdf0e10cSrcweir { 201cdf0e10cSrcweir const String aName(rName); 202cdf0e10cSrcweir const sal_uInt16 nCount = m_pGlosArr->Count(); 203cdf0e10cSrcweir sal_uInt16 i; 204cdf0e10cSrcweir 205cdf0e10cSrcweir for( i = 0; i < nCount; ++i) 206cdf0e10cSrcweir { 207cdf0e10cSrcweir const String *pName = (*m_pGlosArr)[i]; 208cdf0e10cSrcweir if(*pName == aName) 209cdf0e10cSrcweir break; 210cdf0e10cSrcweir } 211cdf0e10cSrcweir if(i == nCount) 212cdf0e10cSrcweir { // Baustein nicht in der Liste 213cdf0e10cSrcweir String *pTmp = new String(aName); 214cdf0e10cSrcweir m_pGlosArr->Insert(pTmp, m_pGlosArr->Count()); 215cdf0e10cSrcweir } 216cdf0e10cSrcweir } 217cdf0e10cSrcweir return GetGlosDoc( rName, bCreate ); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir 220cdf0e10cSrcweir /*------------------------------------------------------------------------ 221cdf0e10cSrcweir Beschreibung: Loeschen Textblock 222cdf0e10cSrcweir ------------------------------------------------------------------------*/ 223cdf0e10cSrcweir 224cdf0e10cSrcweir void SwGlossaries::PutGroupDoc(SwTextBlocks *pBlock) { 225cdf0e10cSrcweir delete pBlock; 226cdf0e10cSrcweir } 227cdf0e10cSrcweir /*------------------------------------------------------------------------ 228cdf0e10cSrcweir Beschreibung: Erzeugt ein neues Dokument mit dem Gruppenname 229cdf0e10cSrcweir Wird temp. auch als File angelegt, damit die 230cdf0e10cSrcweir Gruppen auch spaeter (ohne Zugriff) vorhanden sind. 231cdf0e10cSrcweir ------------------------------------------------------------------------*/ 232cdf0e10cSrcweir 233cdf0e10cSrcweir 234cdf0e10cSrcweir sal_Bool SwGlossaries::NewGroupDoc(String& rGroupName, const String& rTitle) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir sal_uInt16 nNewPath = (sal_uInt16)rGroupName.GetToken(1, GLOS_DELIM).ToInt32(); 237cdf0e10cSrcweir String sNewFilePath(*(*m_pPathArr)[nNewPath]); 238cdf0e10cSrcweir String sNewGroup = lcl_CheckFileName(sNewFilePath, rGroupName.GetToken(0, GLOS_DELIM)); 239cdf0e10cSrcweir sNewGroup += GLOS_DELIM; 240cdf0e10cSrcweir sNewGroup += rGroupName.GetToken(1, GLOS_DELIM); 241cdf0e10cSrcweir SwTextBlocks *pBlock = GetGlosDoc( sNewGroup ); 242cdf0e10cSrcweir if(pBlock) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir String *pTmp = 245cdf0e10cSrcweir new String(sNewGroup); 246cdf0e10cSrcweir SvStrings* pList = GetNameList(); 247cdf0e10cSrcweir pList->Insert(pTmp, pList->Count()); 248cdf0e10cSrcweir pBlock->SetName(rTitle); 249cdf0e10cSrcweir PutGroupDoc(pBlock); 250cdf0e10cSrcweir rGroupName = sNewGroup; 251cdf0e10cSrcweir return sal_True; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir return sal_False; 254cdf0e10cSrcweir } 255cdf0e10cSrcweir /* -----------------23.11.98 13:13------------------- 256cdf0e10cSrcweir * 257cdf0e10cSrcweir * --------------------------------------------------*/ 258cdf0e10cSrcweir sal_Bool SwGlossaries::RenameGroupDoc( 259cdf0e10cSrcweir const String& rOldGroup, String& rNewGroup, const String& rNewTitle ) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir sal_Bool bRet = sal_False; 262cdf0e10cSrcweir sal_uInt16 nOldPath = (sal_uInt16)rOldGroup.GetToken(1, GLOS_DELIM).ToInt32(); 263cdf0e10cSrcweir if(nOldPath < m_pPathArr->Count()) 264cdf0e10cSrcweir { 265cdf0e10cSrcweir String sOldFileURL(*(*m_pPathArr)[nOldPath]); 266cdf0e10cSrcweir sOldFileURL += INET_PATH_TOKEN; 267cdf0e10cSrcweir sOldFileURL += rOldGroup.GetToken(0, GLOS_DELIM); 268cdf0e10cSrcweir sOldFileURL += SwGlossaries::GetExtension(); 269cdf0e10cSrcweir sal_Bool bExist = FStatHelper::IsDocument( sOldFileURL ); 270cdf0e10cSrcweir DBG_ASSERT(bExist, "Gruppe existiert nicht!"); 271cdf0e10cSrcweir if(bExist) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir sal_uInt16 nNewPath = (sal_uInt16)rNewGroup.GetToken(1, GLOS_DELIM).ToInt32(); 274cdf0e10cSrcweir if( nNewPath < m_pPathArr->Count()) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir String sNewFilePath(*(*m_pPathArr)[nNewPath]); 277cdf0e10cSrcweir String sNewFileName = lcl_CheckFileName( 278cdf0e10cSrcweir sNewFilePath, rNewGroup.GetToken(0, GLOS_DELIM)); 279cdf0e10cSrcweir //String aTmp( rNewGroup.GetToken(0, GLOS_DELIM)); 280cdf0e10cSrcweir const sal_uInt16 nFileNameLen = sNewFileName.Len(); 281cdf0e10cSrcweir sNewFileName += SwGlossaries::GetExtension(); 282cdf0e10cSrcweir String sTempNewFilePath(sNewFilePath); 283cdf0e10cSrcweir sTempNewFilePath += INET_PATH_TOKEN; 284cdf0e10cSrcweir sTempNewFilePath += sNewFileName ; 285cdf0e10cSrcweir bExist = FStatHelper::IsDocument( sTempNewFilePath ); 286cdf0e10cSrcweir DBG_ASSERT(!bExist, "Gruppe existiert bereits!"); 287cdf0e10cSrcweir if(!bExist) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir sal_Bool bCopyCompleted = SWUnoHelper::UCB_CopyFile( 290cdf0e10cSrcweir sOldFileURL, sTempNewFilePath, sal_True ); 291cdf0e10cSrcweir if(bCopyCompleted) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir bRet = sal_True; 294cdf0e10cSrcweir RemoveFileFromList( rOldGroup ); 295cdf0e10cSrcweir 296cdf0e10cSrcweir rNewGroup = sNewFileName.Copy(0, nFileNameLen); 297cdf0e10cSrcweir rNewGroup += GLOS_DELIM; 298cdf0e10cSrcweir rNewGroup += String::CreateFromInt32(nNewPath); 299cdf0e10cSrcweir String *pTmp = new String(rNewGroup); 300cdf0e10cSrcweir if(!m_pGlosArr) 301cdf0e10cSrcweir GetNameList(); 302cdf0e10cSrcweir else 303cdf0e10cSrcweir m_pGlosArr->Insert(pTmp, m_pGlosArr->Count()); 304cdf0e10cSrcweir 305cdf0e10cSrcweir sNewFilePath += INET_PATH_TOKEN; 306cdf0e10cSrcweir sNewFilePath += sNewFileName ; 307cdf0e10cSrcweir SwTextBlocks* pNewBlock = new SwTextBlocks( sNewFilePath ); 308cdf0e10cSrcweir pNewBlock->SetName(rNewTitle); 309cdf0e10cSrcweir delete pNewBlock; 310cdf0e10cSrcweir } 311cdf0e10cSrcweir } 312cdf0e10cSrcweir } 313cdf0e10cSrcweir } 314cdf0e10cSrcweir } 315cdf0e10cSrcweir return bRet; 316cdf0e10cSrcweir } 317cdf0e10cSrcweir 318cdf0e10cSrcweir /*------------------------------------------------------------------------ 319cdf0e10cSrcweir Beschreibung: Loescht eine Textbausteingruppe 320cdf0e10cSrcweir ------------------------------------------------------------------------*/ 321cdf0e10cSrcweir 322cdf0e10cSrcweir 323cdf0e10cSrcweir sal_Bool SwGlossaries::DelGroupDoc(const String &rName) 324cdf0e10cSrcweir { 325cdf0e10cSrcweir sal_uInt16 nPath = (sal_uInt16)rName.GetToken(1, GLOS_DELIM).ToInt32(); 326cdf0e10cSrcweir if(nPath >= m_pPathArr->Count()) 327cdf0e10cSrcweir return sal_False; 328cdf0e10cSrcweir String sFileURL(*(*m_pPathArr)[nPath]); 329cdf0e10cSrcweir String aTmp( rName.GetToken(0, GLOS_DELIM)); 330cdf0e10cSrcweir String aName(aTmp); 331cdf0e10cSrcweir aName += GLOS_DELIM; 332cdf0e10cSrcweir aName += String::CreateFromInt32(nPath); 333cdf0e10cSrcweir 334cdf0e10cSrcweir aTmp += SwGlossaries::GetExtension(); 335cdf0e10cSrcweir sFileURL += INET_PATH_TOKEN; 336cdf0e10cSrcweir sFileURL += aTmp; 337cdf0e10cSrcweir // Auch, wenn das File nicht existiert, muss es aus der Liste 338cdf0e10cSrcweir // der Textbausteinbereiche entfernt werden 339cdf0e10cSrcweir // Kein && wegen CFfront 340cdf0e10cSrcweir sal_Bool bRemoved = SWUnoHelper::UCB_DeleteFile( sFileURL ); 341cdf0e10cSrcweir DBG_ASSERT(bRemoved, "file has not been removed"); 342cdf0e10cSrcweir RemoveFileFromList( aName ); 343cdf0e10cSrcweir return bRemoved; 344cdf0e10cSrcweir } 345cdf0e10cSrcweir /*------------------------------------------------------------------------ 346cdf0e10cSrcweir Beschreibung: DTOR 347cdf0e10cSrcweir ------------------------------------------------------------------------*/ 348cdf0e10cSrcweir 349cdf0e10cSrcweir 350cdf0e10cSrcweir SwGlossaries::~SwGlossaries() 351cdf0e10cSrcweir { 352cdf0e10cSrcweir sal_uInt16 nCount = m_pGlosArr? m_pGlosArr->Count() : 0; 353cdf0e10cSrcweir sal_uInt16 i; 354cdf0e10cSrcweir 355cdf0e10cSrcweir for( i = 0; i < nCount; ++i) 356cdf0e10cSrcweir { 357cdf0e10cSrcweir String *pTmp = (*m_pGlosArr)[i]; 358cdf0e10cSrcweir delete pTmp; 359cdf0e10cSrcweir } 360cdf0e10cSrcweir nCount = m_pPathArr? m_pPathArr->Count() : 0; 361cdf0e10cSrcweir for(i = 0; i < nCount; ++i) 362cdf0e10cSrcweir { 363cdf0e10cSrcweir String *pTmp = (*m_pPathArr)[i]; 364cdf0e10cSrcweir delete pTmp; 365cdf0e10cSrcweir } 366cdf0e10cSrcweir delete m_pGlosArr; 367cdf0e10cSrcweir delete m_pPathArr; 368cdf0e10cSrcweir 369cdf0e10cSrcweir InvalidateUNOOjects(); 370cdf0e10cSrcweir } 371cdf0e10cSrcweir /*------------------------------------------------------------------------ 372cdf0e10cSrcweir Beschreibung: Bausteindokument einlesen 373cdf0e10cSrcweir ------------------------------------------------------------------------*/ 374cdf0e10cSrcweir 375cdf0e10cSrcweir 376cdf0e10cSrcweir SwTextBlocks* SwGlossaries::GetGlosDoc( const String &rName, sal_Bool bCreate ) const 377cdf0e10cSrcweir { 378cdf0e10cSrcweir sal_uInt16 nPath = (sal_uInt16)rName.GetToken(1, GLOS_DELIM).ToInt32(); 379cdf0e10cSrcweir SwTextBlocks *pTmp = 0; 380cdf0e10cSrcweir if(nPath < m_pPathArr->Count()) 381cdf0e10cSrcweir { 382cdf0e10cSrcweir String sFileURL(*(*m_pPathArr)[nPath]); 383cdf0e10cSrcweir String aTmp( rName.GetToken(0, GLOS_DELIM)); 384cdf0e10cSrcweir aTmp += SwGlossaries::GetExtension(); 385cdf0e10cSrcweir sFileURL += INET_PATH_TOKEN; 386cdf0e10cSrcweir sFileURL += aTmp; 387cdf0e10cSrcweir 388cdf0e10cSrcweir sal_Bool bExist = sal_False; 389cdf0e10cSrcweir if(!bCreate) 390cdf0e10cSrcweir bExist = FStatHelper::IsDocument( sFileURL ); 391cdf0e10cSrcweir 392cdf0e10cSrcweir if (bCreate || bExist) 393cdf0e10cSrcweir { 394cdf0e10cSrcweir pTmp = new SwTextBlocks( sFileURL ); 395cdf0e10cSrcweir sal_Bool bOk = sal_True; 396cdf0e10cSrcweir if( pTmp->GetError() ) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir ErrorHandler::HandleError( pTmp->GetError() ); 399cdf0e10cSrcweir bOk = !IsError( pTmp->GetError() ); 400cdf0e10cSrcweir } 401cdf0e10cSrcweir 402cdf0e10cSrcweir if( bOk && !pTmp->GetName().Len() ) 403cdf0e10cSrcweir pTmp->SetName( rName ); 404cdf0e10cSrcweir } 405cdf0e10cSrcweir } 406cdf0e10cSrcweir 407cdf0e10cSrcweir return pTmp; 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir /*------------------------------------------------------------------------ 411cdf0e10cSrcweir Beschreibung: Zugriff auf die Liste der Name; diese wird gfs. eingelesen 412cdf0e10cSrcweir ------------------------------------------------------------------------*/ 413cdf0e10cSrcweir 414cdf0e10cSrcweir SvStrings* SwGlossaries::GetNameList() 415cdf0e10cSrcweir { 416cdf0e10cSrcweir if( !m_pGlosArr ) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir m_pGlosArr = new SvStrings; 419cdf0e10cSrcweir String sExt( SwGlossaries::GetExtension() ); 420cdf0e10cSrcweir for( sal_uInt16 i = 0; i < m_pPathArr->Count(); i++ ) 421cdf0e10cSrcweir { 422cdf0e10cSrcweir SvStrings aFiles( 16, 16 ); 423cdf0e10cSrcweir 424cdf0e10cSrcweir SWUnoHelper::UCB_GetFileListOfFolder( *(*m_pPathArr)[i], aFiles, 425cdf0e10cSrcweir &sExt ); 426cdf0e10cSrcweir for( sal_uInt16 nFiles = 0, nFEnd = aFiles.Count(); 427cdf0e10cSrcweir nFiles < nFEnd; ++nFiles ) 428cdf0e10cSrcweir { 429cdf0e10cSrcweir String* pTitle = aFiles[ nFiles ]; 430cdf0e10cSrcweir String sName( pTitle->Copy( 0, pTitle->Len() - sExt.Len() )); 431cdf0e10cSrcweir sName += GLOS_DELIM; 432cdf0e10cSrcweir sName += String::CreateFromInt32( i ); 433cdf0e10cSrcweir m_pGlosArr->Insert( new String(sName), m_pGlosArr->Count() ); 434cdf0e10cSrcweir 435cdf0e10cSrcweir // don't need any more these pointers 436cdf0e10cSrcweir delete pTitle; 437cdf0e10cSrcweir } 438cdf0e10cSrcweir } 439cdf0e10cSrcweir if(!m_pGlosArr->Count()) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir // Der Standard-Baustein steht im ersten Teil des Pfades 442cdf0e10cSrcweir String *pTmp = new String( SwGlossaries::GetDefName() ); 443cdf0e10cSrcweir (*pTmp) += GLOS_DELIM; 444cdf0e10cSrcweir (*pTmp) += '0'; 445cdf0e10cSrcweir m_pGlosArr->Insert(pTmp, m_pGlosArr->Count()); 446cdf0e10cSrcweir } 447cdf0e10cSrcweir } 448cdf0e10cSrcweir return m_pGlosArr; 449cdf0e10cSrcweir } 450cdf0e10cSrcweir 451cdf0e10cSrcweir /*------------------------------------------------------------------------ 452cdf0e10cSrcweir Beschreibung: CTOR 453cdf0e10cSrcweir ------------------------------------------------------------------------*/ 454cdf0e10cSrcweir 455cdf0e10cSrcweir 456cdf0e10cSrcweir SwGlossaries::SwGlossaries() : 457cdf0e10cSrcweir m_pPathArr(0), 458cdf0e10cSrcweir m_pGlosArr(0) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir m_pPathArr = new SvStrings; 461cdf0e10cSrcweir UpdateGlosPath(sal_True); 462cdf0e10cSrcweir } 463cdf0e10cSrcweir 464cdf0e10cSrcweir /*------------------------------------------------------------------------ 465cdf0e10cSrcweir Beschreibung: Neuen Pfad einstellen und internes Array neu aufbauen 466cdf0e10cSrcweir ------------------------------------------------------------------------*/ 467cdf0e10cSrcweir 468cdf0e10cSrcweir /* -----------------21.01.99 15:36------------------- 469cdf0e10cSrcweir * #61050# Doppelte Pfade fuehren zu Verwirrung - als raus damit 470cdf0e10cSrcweir * --------------------------------------------------*/ 471cdf0e10cSrcweir sal_Bool lcl_FindSameEntry(const SvStrings& rDirArr, const String& rEntryURL) 472cdf0e10cSrcweir { 473cdf0e10cSrcweir for(sal_uInt16 i = 0; i < rDirArr.Count(); i++) 474cdf0e10cSrcweir if(rEntryURL == (*rDirArr.GetObject(i))) 475cdf0e10cSrcweir return sal_True; 476cdf0e10cSrcweir return sal_False; 477cdf0e10cSrcweir } 478cdf0e10cSrcweir 479cdf0e10cSrcweir void SwGlossaries::UpdateGlosPath(sal_Bool bFull) 480cdf0e10cSrcweir { 481cdf0e10cSrcweir SvtPathOptions aPathOpt; 482cdf0e10cSrcweir String aNewPath( aPathOpt.GetAutoTextPath() ); 483cdf0e10cSrcweir sal_Bool bPathChanged = m_aPath != aNewPath; 484cdf0e10cSrcweir if (bFull || bPathChanged) 485cdf0e10cSrcweir { 486cdf0e10cSrcweir m_aPath = aNewPath; 487cdf0e10cSrcweir sal_uInt16 nCount = m_pPathArr? m_pPathArr->Count() : 0; 488cdf0e10cSrcweir sal_uInt16 i; 489cdf0e10cSrcweir 490cdf0e10cSrcweir for( i = nCount; i; --i) 491cdf0e10cSrcweir { 492cdf0e10cSrcweir String *pTmp = (*m_pPathArr)[i - 1]; 493cdf0e10cSrcweir m_pPathArr->Remove(i - 1); 494cdf0e10cSrcweir delete pTmp; 495cdf0e10cSrcweir } 496cdf0e10cSrcweir sal_uInt16 nTokenCount = m_aPath.GetTokenCount(SVT_SEARCHPATH_DELIMITER); 497cdf0e10cSrcweir SvStrings aDirArr; 498cdf0e10cSrcweir for( i = 0; i < nTokenCount; i++ ) 499cdf0e10cSrcweir { 500cdf0e10cSrcweir String sPth(m_aPath.GetToken(i, SVT_SEARCHPATH_DELIMITER)); 501cdf0e10cSrcweir sPth = URIHelper::SmartRel2Abs( 502cdf0e10cSrcweir INetURLObject(), sPth, URIHelper::GetMaybeFileHdl()); 503cdf0e10cSrcweir 504cdf0e10cSrcweir if(i && lcl_FindSameEntry(aDirArr, sPth)) 505cdf0e10cSrcweir { 506cdf0e10cSrcweir continue; 507cdf0e10cSrcweir } 508cdf0e10cSrcweir aDirArr.Insert(new String(sPth), aDirArr.Count()); 509cdf0e10cSrcweir if( !FStatHelper::IsFolder( sPth ) ) 510cdf0e10cSrcweir { 511cdf0e10cSrcweir if( m_sErrPath.Len() ) 512cdf0e10cSrcweir m_sErrPath += SVT_SEARCHPATH_DELIMITER; 513cdf0e10cSrcweir INetURLObject aTemp( sPth ); 514cdf0e10cSrcweir m_sErrPath += String(aTemp.GetFull()); 515cdf0e10cSrcweir } 516cdf0e10cSrcweir else 517cdf0e10cSrcweir m_pPathArr->Insert(new String(sPth), m_pPathArr->Count()); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir aDirArr.DeleteAndDestroy(0, aDirArr.Count()); 520cdf0e10cSrcweir 521cdf0e10cSrcweir if(!nTokenCount || 522cdf0e10cSrcweir (m_sErrPath.Len() && (bPathChanged || m_sOldErrPath != m_sErrPath)) ) 523cdf0e10cSrcweir { 524cdf0e10cSrcweir m_sOldErrPath = m_sErrPath; 525cdf0e10cSrcweir // Falscher Pfad, d.h. AutoText-Verzeichnis existiert nicht 526cdf0e10cSrcweir 527cdf0e10cSrcweir ErrorHandler::HandleError( *new StringErrorInfo( 528cdf0e10cSrcweir ERR_AUTOPATH_ERROR, m_sErrPath, 529cdf0e10cSrcweir ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR )); 530cdf0e10cSrcweir m_bError = sal_True; 531cdf0e10cSrcweir } 532cdf0e10cSrcweir else 533cdf0e10cSrcweir m_bError = sal_False; 534cdf0e10cSrcweir 535cdf0e10cSrcweir if(m_pGlosArr) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir for(i = 0; i < m_pGlosArr->Count(); ++i) 538cdf0e10cSrcweir { 539cdf0e10cSrcweir delete (String *)(*m_pGlosArr)[i]; 540cdf0e10cSrcweir } 541cdf0e10cSrcweir DELETEZ(m_pGlosArr); 542cdf0e10cSrcweir GetNameList(); 543cdf0e10cSrcweir } 544cdf0e10cSrcweir } 545cdf0e10cSrcweir } 546cdf0e10cSrcweir 547cdf0e10cSrcweir /*------------------------------------------------------------------------ 548cdf0e10cSrcweir Beschreibung: 549cdf0e10cSrcweir ------------------------------------------------------------------------*/ 550cdf0e10cSrcweir 551cdf0e10cSrcweir 552cdf0e10cSrcweir void SwGlossaries::ShowError() 553cdf0e10cSrcweir { 554cdf0e10cSrcweir sal_uInt32 nPathError = *new StringErrorInfo(ERR_AUTOPATH_ERROR, 555cdf0e10cSrcweir m_sErrPath, ERRCODE_BUTTON_OK ); 556cdf0e10cSrcweir ErrorHandler::HandleError( nPathError ); 557cdf0e10cSrcweir } 558cdf0e10cSrcweir /* -----------------------------09.02.00 11:37-------------------------------- 559cdf0e10cSrcweir 560cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 561cdf0e10cSrcweir String SwGlossaries::GetExtension() 562cdf0e10cSrcweir { 563cdf0e10cSrcweir return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( ".bau" )); 564cdf0e10cSrcweir } 565cdf0e10cSrcweir 566cdf0e10cSrcweir 567cdf0e10cSrcweir 568cdf0e10cSrcweir void SwGlossaries::RemoveFileFromList( const String& rGroup ) 569cdf0e10cSrcweir { 570cdf0e10cSrcweir if(m_pGlosArr) 571cdf0e10cSrcweir { 572cdf0e10cSrcweir const sal_uInt16 nCount = m_pGlosArr->Count(); 573cdf0e10cSrcweir for(sal_uInt16 i = 0; i < nCount; ++i) 574cdf0e10cSrcweir { 575cdf0e10cSrcweir String *pTmp = (*m_pGlosArr)[i]; 576cdf0e10cSrcweir if(*pTmp == rGroup) 577cdf0e10cSrcweir { 578cdf0e10cSrcweir rtl::OUString aUName = rGroup; 579cdf0e10cSrcweir { 580cdf0e10cSrcweir // tell the UNO AutoTextGroup object that it's not valid anymore 581cdf0e10cSrcweir for ( UnoAutoTextGroups::iterator aLoop = m_aGlossaryGroups.begin(); 582cdf0e10cSrcweir aLoop != m_aGlossaryGroups.end(); 583cdf0e10cSrcweir ++aLoop 584cdf0e10cSrcweir ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir Reference< container::XNamed > xNamed( aLoop->get(), UNO_QUERY ); 587cdf0e10cSrcweir if ( xNamed.is() && ( xNamed->getName() == aUName ) ) 588cdf0e10cSrcweir { 589cdf0e10cSrcweir static_cast< SwXAutoTextGroup* >( xNamed.get() )->Invalidate(); 590cdf0e10cSrcweir // note that this static_cast works because we know that the array only 591cdf0e10cSrcweir // contains SwXAutoTextGroup implementation 592cdf0e10cSrcweir m_aGlossaryGroups.erase( aLoop ); 593cdf0e10cSrcweir break; 594cdf0e10cSrcweir } 595cdf0e10cSrcweir } 596cdf0e10cSrcweir } 597cdf0e10cSrcweir 598cdf0e10cSrcweir { 599cdf0e10cSrcweir // tell all our UNO AutoTextEntry objects that they're not valid anymore 600cdf0e10cSrcweir for ( UnoAutoTextEntries::iterator aLoop = m_aGlossaryEntries.begin(); 601cdf0e10cSrcweir aLoop != m_aGlossaryEntries.end(); 602cdf0e10cSrcweir ) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir Reference< lang::XUnoTunnel > xEntryTunnel( aLoop->get(), UNO_QUERY ); 605cdf0e10cSrcweir 606cdf0e10cSrcweir SwXAutoTextEntry* pEntry = NULL; 607cdf0e10cSrcweir if ( xEntryTunnel.is() ) 608cdf0e10cSrcweir pEntry = reinterpret_cast< SwXAutoTextEntry* >( 609cdf0e10cSrcweir xEntryTunnel->getSomething( SwXAutoTextEntry::getUnoTunnelId() ) ); 610cdf0e10cSrcweir 611cdf0e10cSrcweir if ( pEntry && ( pEntry->GetGroupName() == rGroup ) ) 612cdf0e10cSrcweir { 613cdf0e10cSrcweir pEntry->Invalidate(); 614cdf0e10cSrcweir aLoop = m_aGlossaryEntries.erase( aLoop ); 615cdf0e10cSrcweir } 616cdf0e10cSrcweir else 617cdf0e10cSrcweir ++aLoop; 618cdf0e10cSrcweir } 619cdf0e10cSrcweir } 620cdf0e10cSrcweir 621cdf0e10cSrcweir m_pGlosArr->Remove(i); 622cdf0e10cSrcweir delete pTmp; 623cdf0e10cSrcweir break; 624cdf0e10cSrcweir } 625cdf0e10cSrcweir } 626cdf0e10cSrcweir } 627cdf0e10cSrcweir } 628cdf0e10cSrcweir 629cdf0e10cSrcweir 630cdf0e10cSrcweir String SwGlossaries::GetCompleteGroupName( const rtl::OUString& GroupName ) 631cdf0e10cSrcweir { 632cdf0e10cSrcweir sal_uInt16 nCount = GetGroupCnt(); 633cdf0e10cSrcweir //wenn der Gruppenname intern erzeugt wurde, dann steht auch hier der Pfad drin 634cdf0e10cSrcweir String sGroup(GroupName); 635cdf0e10cSrcweir String sGroupName(sGroup.GetToken(0, GLOS_DELIM)); 636cdf0e10cSrcweir String sPath = sGroup.GetToken(1, GLOS_DELIM); 637cdf0e10cSrcweir sal_Bool bPathLen = sPath.Len() > 0; 638cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < nCount; i++ ) 639cdf0e10cSrcweir { 640cdf0e10cSrcweir String sGrpName = GetGroupName(i); 641cdf0e10cSrcweir if(bPathLen ? sGroup == sGrpName : sGroupName == sGrpName.GetToken(0, GLOS_DELIM)) 642cdf0e10cSrcweir { 643cdf0e10cSrcweir return sGrpName; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir } 646cdf0e10cSrcweir return aEmptyStr; 647cdf0e10cSrcweir } 648cdf0e10cSrcweir 649cdf0e10cSrcweir 650cdf0e10cSrcweir void SwGlossaries::InvalidateUNOOjects() 651cdf0e10cSrcweir { 652cdf0e10cSrcweir // invalidate all the AutoTextGroup-objects 653cdf0e10cSrcweir for ( UnoAutoTextGroups::iterator aGroupLoop = m_aGlossaryGroups.begin(); 654cdf0e10cSrcweir aGroupLoop != m_aGlossaryGroups.end(); 655cdf0e10cSrcweir ++aGroupLoop 656cdf0e10cSrcweir ) 657cdf0e10cSrcweir { 658cdf0e10cSrcweir Reference< text::XAutoTextGroup > xGroup( aGroupLoop->get(), UNO_QUERY ); 659cdf0e10cSrcweir if ( xGroup.is() ) 660cdf0e10cSrcweir static_cast< SwXAutoTextGroup* >( xGroup.get() )->Invalidate(); 661cdf0e10cSrcweir } 662cdf0e10cSrcweir UnoAutoTextGroups aTmpg = UnoAutoTextGroups(); 663cdf0e10cSrcweir m_aGlossaryGroups.swap( aTmpg ); 664cdf0e10cSrcweir 665cdf0e10cSrcweir // invalidate all the AutoTextEntry-objects 666cdf0e10cSrcweir for ( UnoAutoTextEntries::const_iterator aEntryLoop = m_aGlossaryEntries.begin(); 667cdf0e10cSrcweir aEntryLoop != m_aGlossaryEntries.end(); 668cdf0e10cSrcweir ++aEntryLoop 669cdf0e10cSrcweir ) 670cdf0e10cSrcweir { 671cdf0e10cSrcweir Reference< lang::XUnoTunnel > xEntryTunnel( aEntryLoop->get(), UNO_QUERY ); 672cdf0e10cSrcweir SwXAutoTextEntry* pEntry = NULL; 673cdf0e10cSrcweir if ( xEntryTunnel.is() ) 674cdf0e10cSrcweir pEntry = reinterpret_cast< SwXAutoTextEntry* >( 675cdf0e10cSrcweir xEntryTunnel->getSomething( SwXAutoTextEntry::getUnoTunnelId() ) ); 676cdf0e10cSrcweir 677cdf0e10cSrcweir if ( pEntry ) 678cdf0e10cSrcweir pEntry->Invalidate(); 679cdf0e10cSrcweir } 680cdf0e10cSrcweir UnoAutoTextEntries aTmpe = UnoAutoTextEntries(); 681cdf0e10cSrcweir m_aGlossaryEntries.swap( aTmpe ); 682cdf0e10cSrcweir } 683cdf0e10cSrcweir 684cdf0e10cSrcweir //----------------------------------------------------------------------- 685cdf0e10cSrcweir //--- 03.03.2003 14:15:32 ----------------------------------------------- 686cdf0e10cSrcweir 687cdf0e10cSrcweir Reference< text::XAutoTextGroup > SwGlossaries::GetAutoTextGroup( const ::rtl::OUString& _rGroupName, bool _bCreate ) 688cdf0e10cSrcweir { 689cdf0e10cSrcweir // first, find the name with path-extension 690cdf0e10cSrcweir String sCompleteGroupName = GetCompleteGroupName( _rGroupName ); 691cdf0e10cSrcweir 692cdf0e10cSrcweir Reference< text::XAutoTextGroup > xGroup; 693cdf0e10cSrcweir 694cdf0e10cSrcweir // look up the group in the cache 695cdf0e10cSrcweir UnoAutoTextGroups::iterator aSearch = m_aGlossaryGroups.begin(); 696cdf0e10cSrcweir for ( ; aSearch != m_aGlossaryGroups.end(); ) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir Reference< lang::XUnoTunnel > xGroupTunnel( aSearch->get(), UNO_QUERY ); 699cdf0e10cSrcweir 700cdf0e10cSrcweir SwXAutoTextGroup* pSwGroup = 0; 701cdf0e10cSrcweir if ( xGroupTunnel.is() ) 702cdf0e10cSrcweir pSwGroup = reinterpret_cast< SwXAutoTextGroup* >( xGroupTunnel->getSomething( SwXAutoTextGroup::getUnoTunnelId() ) ); 703cdf0e10cSrcweir 704cdf0e10cSrcweir if ( !pSwGroup ) 705cdf0e10cSrcweir { 706cdf0e10cSrcweir // the object is dead in the meantime -> remove from cache 707cdf0e10cSrcweir aSearch = m_aGlossaryGroups.erase( aSearch ); 708cdf0e10cSrcweir continue; 709cdf0e10cSrcweir } 710cdf0e10cSrcweir 711cdf0e10cSrcweir if ( _rGroupName == pSwGroup->getName() ) 712cdf0e10cSrcweir { // the group is already cached 713cdf0e10cSrcweir if ( sCompleteGroupName.Len() ) 714cdf0e10cSrcweir { // the group still exists -> return it 715cdf0e10cSrcweir xGroup = pSwGroup; 716cdf0e10cSrcweir break; 717cdf0e10cSrcweir } 718cdf0e10cSrcweir else 719cdf0e10cSrcweir { 720cdf0e10cSrcweir // this group does not exist (anymore) -> release the cached UNO object for it 721cdf0e10cSrcweir aSearch = m_aGlossaryGroups.erase( aSearch ); 722cdf0e10cSrcweir // so it won't be created below 723cdf0e10cSrcweir _bCreate = sal_False; 724cdf0e10cSrcweir break; 725cdf0e10cSrcweir } 726cdf0e10cSrcweir } 727cdf0e10cSrcweir 728cdf0e10cSrcweir ++aSearch; 729cdf0e10cSrcweir } 730cdf0e10cSrcweir 731cdf0e10cSrcweir if ( !xGroup.is() && _bCreate ) 732cdf0e10cSrcweir { 733cdf0e10cSrcweir xGroup = new SwXAutoTextGroup( sCompleteGroupName, this ); 734cdf0e10cSrcweir // cache it 735cdf0e10cSrcweir m_aGlossaryGroups.push_back( AutoTextGroupRef( xGroup ) ); 736cdf0e10cSrcweir } 737cdf0e10cSrcweir 738cdf0e10cSrcweir return xGroup; 739cdf0e10cSrcweir } 740cdf0e10cSrcweir 741cdf0e10cSrcweir //----------------------------------------------------------------------- 742cdf0e10cSrcweir //--- 03.03.2003 13:46:06 ----------------------------------------------- 743cdf0e10cSrcweir 744cdf0e10cSrcweir Reference< text::XAutoTextEntry > SwGlossaries::GetAutoTextEntry( const String& _rCompleteGroupName, const ::rtl::OUString& _rGroupName, const ::rtl::OUString& _rEntryName, 745cdf0e10cSrcweir bool _bCreate ) 746cdf0e10cSrcweir { 747cdf0e10cSrcweir //standard must be created 748cdf0e10cSrcweir sal_Bool bCreate = ( _rCompleteGroupName == GetDefName() ); 749cdf0e10cSrcweir ::std::auto_ptr< SwTextBlocks > pGlosGroup( GetGroupDoc( _rCompleteGroupName, bCreate ) ); 750cdf0e10cSrcweir 751cdf0e10cSrcweir if ( pGlosGroup.get() && !pGlosGroup->GetError() ) 752cdf0e10cSrcweir { 753cdf0e10cSrcweir sal_uInt16 nIdx = pGlosGroup->GetIndex( _rEntryName ); 754cdf0e10cSrcweir if ( USHRT_MAX == nIdx ) 755cdf0e10cSrcweir throw container::NoSuchElementException(); 756cdf0e10cSrcweir } 757cdf0e10cSrcweir else 758cdf0e10cSrcweir throw lang::WrappedTargetException(); 759cdf0e10cSrcweir 760cdf0e10cSrcweir Reference< text::XAutoTextEntry > xReturn; 761cdf0e10cSrcweir String sGroupName( _rGroupName ); 762cdf0e10cSrcweir String sEntryName( _rEntryName ); 763cdf0e10cSrcweir 764cdf0e10cSrcweir UnoAutoTextEntries::iterator aSearch( m_aGlossaryEntries.begin() ); 765cdf0e10cSrcweir for ( ; aSearch != m_aGlossaryEntries.end(); ) 766cdf0e10cSrcweir { 767cdf0e10cSrcweir Reference< lang::XUnoTunnel > xEntryTunnel( aSearch->get(), UNO_QUERY ); 768cdf0e10cSrcweir 769cdf0e10cSrcweir SwXAutoTextEntry* pEntry = NULL; 770cdf0e10cSrcweir if ( xEntryTunnel.is() ) 771cdf0e10cSrcweir pEntry = reinterpret_cast< SwXAutoTextEntry* >( xEntryTunnel->getSomething( SwXAutoTextEntry::getUnoTunnelId() ) ); 772cdf0e10cSrcweir else 773cdf0e10cSrcweir { 774cdf0e10cSrcweir // the object is dead in the meantime -> remove from cache 775cdf0e10cSrcweir aSearch = m_aGlossaryEntries.erase( aSearch ); 776cdf0e10cSrcweir continue; 777cdf0e10cSrcweir } 778cdf0e10cSrcweir 779cdf0e10cSrcweir if ( pEntry 780cdf0e10cSrcweir && ( COMPARE_EQUAL == pEntry->GetGroupName().CompareTo( sGroupName ) ) 781cdf0e10cSrcweir && ( COMPARE_EQUAL == pEntry->GetEntryName().CompareTo( sEntryName ) ) 782cdf0e10cSrcweir ) 783cdf0e10cSrcweir { 784cdf0e10cSrcweir xReturn = pEntry; 785cdf0e10cSrcweir break; 786cdf0e10cSrcweir } 787cdf0e10cSrcweir 788cdf0e10cSrcweir ++aSearch; 789cdf0e10cSrcweir } 790cdf0e10cSrcweir 791cdf0e10cSrcweir if ( !xReturn.is() && _bCreate ) 792cdf0e10cSrcweir { 793cdf0e10cSrcweir xReturn = new SwXAutoTextEntry( this, sGroupName, sEntryName ); 794cdf0e10cSrcweir // cache it 795cdf0e10cSrcweir m_aGlossaryEntries.push_back( AutoTextEntryRef( xReturn ) ); 796cdf0e10cSrcweir } 797cdf0e10cSrcweir 798cdf0e10cSrcweir return xReturn; 799cdf0e10cSrcweir } 800cdf0e10cSrcweir 801cdf0e10cSrcweir 802cdf0e10cSrcweir 803