xref: /trunk/main/sw/source/ui/misc/glosdoc.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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