xref: /aoo41x/main/sw/source/core/doc/acmplwrd.cxx (revision efeef26f)
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
10*efeef26fSAndrew Rist  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*efeef26fSAndrew Rist  *
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.
19*efeef26fSAndrew Rist  *
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 
28cdf0e10cSrcweir #include <tools/urlobj.hxx>
29cdf0e10cSrcweir #include <hintids.hxx>
30cdf0e10cSrcweir #include <hints.hxx>
31cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
32cdf0e10cSrcweir #include <acmplwrd.hxx>
33cdf0e10cSrcweir #include <doc.hxx>
34cdf0e10cSrcweir #include <ndindex.hxx>
35cdf0e10cSrcweir #include <docary.hxx>
36cdf0e10cSrcweir #include <ndtxt.hxx>
37cdf0e10cSrcweir #include <pam.hxx>
38cdf0e10cSrcweir #include <pagedesc.hxx>
39cdf0e10cSrcweir #include <poolfmt.hxx>
40cdf0e10cSrcweir #include <calbck.hxx>
41cdf0e10cSrcweir #include <editeng/svxacorr.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include <editeng/acorrcfg.hxx>
44cdf0e10cSrcweir #include <sfx2/docfile.hxx>
45cdf0e10cSrcweir #include <docsh.hxx>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #include <vector>
48cdf0e10cSrcweir /* -----------------------------05.08.2002 12:43------------------------------
49cdf0e10cSrcweir 
50cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
51cdf0e10cSrcweir class SwAutoCompleteClient : public SwClient
52cdf0e10cSrcweir {
53cdf0e10cSrcweir     SwAutoCompleteWord* pAutoCompleteWord;
54cdf0e10cSrcweir     SwDoc*              pDoc;
55cdf0e10cSrcweir #ifdef DBG_UTIL
56cdf0e10cSrcweir     static sal_uLong nSwAutoCompleteClientCount;
57cdf0e10cSrcweir #endif
58cdf0e10cSrcweir public:
59cdf0e10cSrcweir     SwAutoCompleteClient(SwAutoCompleteWord& rToTell, SwDoc& rSwDoc);
60cdf0e10cSrcweir     SwAutoCompleteClient(const SwAutoCompleteClient& rClient);
61cdf0e10cSrcweir     ~SwAutoCompleteClient();
62cdf0e10cSrcweir 
63cdf0e10cSrcweir     SwAutoCompleteClient& operator=(const SwAutoCompleteClient& rClient);
64cdf0e10cSrcweir 
GetDoc()65cdf0e10cSrcweir     const SwDoc& GetDoc(){return *pDoc;}
66cdf0e10cSrcweir #ifdef DBG_UTIL
GetElementCount()67cdf0e10cSrcweir     static sal_uLong GetElementCount() {return nSwAutoCompleteClientCount;}
68cdf0e10cSrcweir #endif
69cdf0e10cSrcweir protected:
70cdf0e10cSrcweir     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew);
71cdf0e10cSrcweir };
72cdf0e10cSrcweir /* -----------------------------05.08.2002 12:48------------------------------
73cdf0e10cSrcweir 
74cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
75cdf0e10cSrcweir typedef std::vector<SwAutoCompleteClient> SwAutoCompleteClientVector;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir class SwAutoCompleteWord_Impl
78cdf0e10cSrcweir {
79cdf0e10cSrcweir     SwAutoCompleteClientVector  aClientVector;
80cdf0e10cSrcweir     SwAutoCompleteWord&         rAutoCompleteWord;
81cdf0e10cSrcweir public:
SwAutoCompleteWord_Impl(SwAutoCompleteWord & rParent)82cdf0e10cSrcweir     SwAutoCompleteWord_Impl(SwAutoCompleteWord& rParent) :
83cdf0e10cSrcweir         rAutoCompleteWord(rParent){}
84cdf0e10cSrcweir     void AddDocument(SwDoc& rDoc);
85cdf0e10cSrcweir     void RemoveDocument(const SwDoc& rDoc);
86cdf0e10cSrcweir };
87cdf0e10cSrcweir 
88cdf0e10cSrcweir /* -----------------------------05.08.2002 14:11------------------------------
89cdf0e10cSrcweir 
90cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
91cdf0e10cSrcweir typedef const SwDoc* SwDocPtr;
92cdf0e10cSrcweir typedef std::vector<SwDocPtr> SwDocPtrVector;
93cdf0e10cSrcweir class SwAutoCompleteString : public String
94cdf0e10cSrcweir {
95cdf0e10cSrcweir #ifdef DBG_UTIL
96cdf0e10cSrcweir     static sal_uLong nSwAutoCompleteStringCount;
97cdf0e10cSrcweir #endif
98cdf0e10cSrcweir     SwDocPtrVector aSourceDocs;
99cdf0e10cSrcweir     public:
100cdf0e10cSrcweir         SwAutoCompleteString(const String& rStr, xub_StrLen nPos, xub_StrLen nLen);
101cdf0e10cSrcweir 
102cdf0e10cSrcweir         ~SwAutoCompleteString();
103cdf0e10cSrcweir         void        AddDocument(const SwDoc& rDoc);
104cdf0e10cSrcweir         //returns true if last document reference has been removed
105cdf0e10cSrcweir         sal_Bool     RemoveDocument(const SwDoc& rDoc);
106cdf0e10cSrcweir #ifdef DBG_UTIL
GetElementCount()107cdf0e10cSrcweir     static sal_uLong GetElementCount() {return nSwAutoCompleteStringCount;}
108cdf0e10cSrcweir #endif
109cdf0e10cSrcweir };
110cdf0e10cSrcweir #ifdef DBG_UTIL
111cdf0e10cSrcweir     sal_uLong SwAutoCompleteClient::nSwAutoCompleteClientCount = 0;
112cdf0e10cSrcweir     sal_uLong SwAutoCompleteString::nSwAutoCompleteStringCount = 0;
113cdf0e10cSrcweir #endif
114cdf0e10cSrcweir /* -----------------------------06.08.2002 08:57------------------------------
115cdf0e10cSrcweir 
116cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SwAutoCompleteClient(SwAutoCompleteWord & rToTell,SwDoc & rSwDoc)117cdf0e10cSrcweir SwAutoCompleteClient::SwAutoCompleteClient(SwAutoCompleteWord& rToTell, SwDoc& rSwDoc) :
118cdf0e10cSrcweir         pAutoCompleteWord(&rToTell),
119cdf0e10cSrcweir         pDoc(&rSwDoc)
120cdf0e10cSrcweir {
121cdf0e10cSrcweir     pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
122cdf0e10cSrcweir #ifdef DBG_UTIL
123cdf0e10cSrcweir     ++nSwAutoCompleteClientCount;
124cdf0e10cSrcweir #endif
125cdf0e10cSrcweir }
126cdf0e10cSrcweir /* -----------------------------05.08.2002 14:07------------------------------
127cdf0e10cSrcweir 
128cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SwAutoCompleteClient(const SwAutoCompleteClient & rClient)129cdf0e10cSrcweir SwAutoCompleteClient::SwAutoCompleteClient(const SwAutoCompleteClient& rClient) :
130cdf0e10cSrcweir     SwClient(),
131cdf0e10cSrcweir     pAutoCompleteWord(rClient.pAutoCompleteWord),
132cdf0e10cSrcweir     pDoc(rClient.pDoc)
133cdf0e10cSrcweir {
134cdf0e10cSrcweir     pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
135cdf0e10cSrcweir #ifdef DBG_UTIL
136cdf0e10cSrcweir     ++nSwAutoCompleteClientCount;
137cdf0e10cSrcweir #endif
138cdf0e10cSrcweir }
139cdf0e10cSrcweir /* -----------------------------05.08.2002 14:10------------------------------
140cdf0e10cSrcweir 
141cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
~SwAutoCompleteClient()142cdf0e10cSrcweir SwAutoCompleteClient::~SwAutoCompleteClient()
143cdf0e10cSrcweir {
144cdf0e10cSrcweir #ifdef DBG_UTIL
145cdf0e10cSrcweir     --nSwAutoCompleteClientCount;
146cdf0e10cSrcweir #endif
147cdf0e10cSrcweir }
148cdf0e10cSrcweir /* -----------------06.03.2003 15:30-----------------
149cdf0e10cSrcweir 
150cdf0e10cSrcweir  --------------------------------------------------*/
operator =(const SwAutoCompleteClient & rClient)151cdf0e10cSrcweir SwAutoCompleteClient& SwAutoCompleteClient::operator=(const SwAutoCompleteClient& rClient)
152cdf0e10cSrcweir {
153cdf0e10cSrcweir     pAutoCompleteWord = rClient.pAutoCompleteWord;
154cdf0e10cSrcweir     pDoc = rClient.pDoc;
155cdf0e10cSrcweir     if(rClient.GetRegisteredIn())
156cdf0e10cSrcweir         ((SwModify*)rClient.GetRegisteredIn())->Add(this);
157cdf0e10cSrcweir     else if(GetRegisteredIn())
158cdf0e10cSrcweir         GetRegisteredInNonConst()->Remove(this);
159cdf0e10cSrcweir     return *this;
160cdf0e10cSrcweir }
161cdf0e10cSrcweir /* -----------------------------05.08.2002 12:49------------------------------
162cdf0e10cSrcweir 
163cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
Modify(const SfxPoolItem * pOld,const SfxPoolItem *)164cdf0e10cSrcweir void SwAutoCompleteClient::Modify( const SfxPoolItem* pOld, const SfxPoolItem *)
165cdf0e10cSrcweir {
166cdf0e10cSrcweir     switch( pOld ? pOld->Which() : 0 )
167cdf0e10cSrcweir 	{
168cdf0e10cSrcweir 	case RES_REMOVE_UNO_OBJECT:
169cdf0e10cSrcweir 	case RES_OBJECTDYING:
170cdf0e10cSrcweir         if( (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject )
171cdf0e10cSrcweir             ((SwModify*)GetRegisteredIn())->Remove(this);
172cdf0e10cSrcweir             pAutoCompleteWord->DocumentDying(*pDoc);
173cdf0e10cSrcweir 		break;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir /* -----------------------------05.08.2002 13:03------------------------------
178cdf0e10cSrcweir 
179cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
AddDocument(SwDoc & rDoc)180cdf0e10cSrcweir void SwAutoCompleteWord_Impl::AddDocument(SwDoc& rDoc)
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     SwAutoCompleteClientVector::iterator aIt;
183cdf0e10cSrcweir     for(aIt = aClientVector.begin(); aIt != aClientVector.end(); aIt++)
184cdf0e10cSrcweir     {
185cdf0e10cSrcweir         if(&aIt->GetDoc() == &rDoc)
186cdf0e10cSrcweir             return;
187cdf0e10cSrcweir     }
188cdf0e10cSrcweir     aClientVector.push_back(SwAutoCompleteClient(rAutoCompleteWord, rDoc));
189cdf0e10cSrcweir }
190cdf0e10cSrcweir /* -----------------------------05.08.2002 14:33------------------------------
191cdf0e10cSrcweir 
192cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
RemoveDocument(const SwDoc & rDoc)193cdf0e10cSrcweir void SwAutoCompleteWord_Impl::RemoveDocument(const SwDoc& rDoc)
194cdf0e10cSrcweir {
195cdf0e10cSrcweir     SwAutoCompleteClientVector::iterator aIt;
196cdf0e10cSrcweir     for(aIt = aClientVector.begin(); aIt != aClientVector.end(); aIt++)
197cdf0e10cSrcweir     {
198cdf0e10cSrcweir         if(&aIt->GetDoc() == &rDoc)
199cdf0e10cSrcweir         {
200cdf0e10cSrcweir             aClientVector.erase(aIt);
201cdf0e10cSrcweir             return;
202cdf0e10cSrcweir         }
203cdf0e10cSrcweir     }
204cdf0e10cSrcweir }
205cdf0e10cSrcweir /* -----------------------------06.08.2002 08:54------------------------------
206cdf0e10cSrcweir 
207cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SwAutoCompleteString(const String & rStr,xub_StrLen nPos,xub_StrLen nLen)208cdf0e10cSrcweir SwAutoCompleteString::SwAutoCompleteString(const String& rStr, xub_StrLen nPos, xub_StrLen nLen) :
209cdf0e10cSrcweir             String( rStr, nPos, nLen )
210cdf0e10cSrcweir {
211cdf0e10cSrcweir #ifdef DBG_UTIL
212cdf0e10cSrcweir     ++nSwAutoCompleteStringCount;
213cdf0e10cSrcweir #endif
214cdf0e10cSrcweir }
215cdf0e10cSrcweir /* -----------------------------05.08.2002 14:22------------------------------
216cdf0e10cSrcweir 
217cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
~SwAutoCompleteString()218cdf0e10cSrcweir SwAutoCompleteString::~SwAutoCompleteString()
219cdf0e10cSrcweir {
220cdf0e10cSrcweir #ifdef DBG_UTIL
221cdf0e10cSrcweir     --nSwAutoCompleteStringCount;
222cdf0e10cSrcweir #endif
223cdf0e10cSrcweir }
224cdf0e10cSrcweir /* -----------------------------05.08.2002 14:17------------------------------
225cdf0e10cSrcweir 
226cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
AddDocument(const SwDoc & rDoc)227cdf0e10cSrcweir void SwAutoCompleteString::AddDocument(const SwDoc& rDoc)
228cdf0e10cSrcweir {
229cdf0e10cSrcweir     SwDocPtrVector::iterator aIt;
230cdf0e10cSrcweir     for(aIt = aSourceDocs.begin(); aIt != aSourceDocs.end(); aIt++)
231cdf0e10cSrcweir     {
232cdf0e10cSrcweir         if(*aIt == &rDoc)
233cdf0e10cSrcweir             return;
234cdf0e10cSrcweir     }
235cdf0e10cSrcweir     SwDocPtr pNew = &rDoc;
236cdf0e10cSrcweir     aSourceDocs.push_back(pNew);
237cdf0e10cSrcweir }
238cdf0e10cSrcweir /* -----------------------------05.08.2002 14:36------------------------------
239cdf0e10cSrcweir 
240cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
RemoveDocument(const SwDoc & rDoc)241cdf0e10cSrcweir sal_Bool SwAutoCompleteString::RemoveDocument(const SwDoc& rDoc)
242cdf0e10cSrcweir {
243cdf0e10cSrcweir     SwDocPtrVector::iterator aIt;
244cdf0e10cSrcweir     for(aIt = aSourceDocs.begin(); aIt != aSourceDocs.end(); aIt++)
245cdf0e10cSrcweir     {
246cdf0e10cSrcweir         if(*aIt == &rDoc)
247cdf0e10cSrcweir         {
248cdf0e10cSrcweir             aSourceDocs.erase(aIt);
249cdf0e10cSrcweir             return !aSourceDocs.size();
250cdf0e10cSrcweir         }
251cdf0e10cSrcweir     }
252cdf0e10cSrcweir     return sal_False;
253cdf0e10cSrcweir }
254cdf0e10cSrcweir /* ---------------------------------------------------------------------------
255cdf0e10cSrcweir 
256cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SwAutoCompleteWord(sal_uInt16 nWords,sal_uInt16 nMWrdLen)257cdf0e10cSrcweir SwAutoCompleteWord::SwAutoCompleteWord( sal_uInt16 nWords, sal_uInt16 nMWrdLen )
258cdf0e10cSrcweir 	: aWordLst( 0, 255 ), aLRULst( 0, 255 ),
259cdf0e10cSrcweir     pImpl(new SwAutoCompleteWord_Impl(*this)),
260cdf0e10cSrcweir 	nMaxCount( nWords ),
261cdf0e10cSrcweir 	nMinWrdLen( nMWrdLen ),
262cdf0e10cSrcweir 	bLockWordLst( sal_False )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
~SwAutoCompleteWord()266cdf0e10cSrcweir SwAutoCompleteWord::~SwAutoCompleteWord()
267cdf0e10cSrcweir {
268cdf0e10cSrcweir     for(sal_uInt16 nPos = aWordLst.Count(); nPos; nPos--)
269cdf0e10cSrcweir     {
270cdf0e10cSrcweir         SwAutoCompleteString* pCurrent = (SwAutoCompleteString*)aWordLst[ nPos - 1 ];
271cdf0e10cSrcweir         aWordLst.Remove( nPos - 1 );
272cdf0e10cSrcweir         delete pCurrent;
273cdf0e10cSrcweir     }
274cdf0e10cSrcweir     delete pImpl;
275cdf0e10cSrcweir #ifdef DBG_UTIL
276cdf0e10cSrcweir     sal_uLong nStrings = SwAutoCompleteString::GetElementCount();
277cdf0e10cSrcweir     sal_uLong nClients = SwAutoCompleteClient::GetElementCount();
278cdf0e10cSrcweir     DBG_ASSERT(!nStrings && !nClients, "AutoComplete: clients or string count mismatch");
279cdf0e10cSrcweir #endif
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
InsertWord(const String & rWord,SwDoc & rDoc)282cdf0e10cSrcweir sal_Bool SwAutoCompleteWord::InsertWord( const String& rWord, SwDoc& rDoc )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir     SwDocShell* pDocShell = rDoc.GetDocShell();
285cdf0e10cSrcweir     SfxMedium* pMedium = pDocShell ? pDocShell->GetMedium() : 0;
286cdf0e10cSrcweir     // strings from help module should not be added
287cdf0e10cSrcweir     if( pMedium )
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         const INetURLObject& rURL = pMedium->GetURLObject();
290cdf0e10cSrcweir         if ( rURL.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP )
291cdf0e10cSrcweir             return sal_False;
292cdf0e10cSrcweir     }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     String aNewWord(rWord);
295cdf0e10cSrcweir     aNewWord.EraseAllChars( CH_TXTATR_INWORD );
296cdf0e10cSrcweir     aNewWord.EraseAllChars( CH_TXTATR_BREAKWORD );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     pImpl->AddDocument(rDoc);
299cdf0e10cSrcweir     sal_Bool bRet = sal_False;
300cdf0e10cSrcweir     xub_StrLen nWrdLen = aNewWord.Len();
301cdf0e10cSrcweir     while( nWrdLen && '.' == aNewWord.GetChar( nWrdLen-1 ))
302cdf0e10cSrcweir 		--nWrdLen;
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 	if( !bLockWordLst && nWrdLen >= nMinWrdLen )
305cdf0e10cSrcweir 	{
306cdf0e10cSrcweir         SwAutoCompleteString* pAutoString;
307cdf0e10cSrcweir         StringPtr pNew = pAutoString = new SwAutoCompleteString( aNewWord, 0, nWrdLen );
308cdf0e10cSrcweir         pAutoString->AddDocument(rDoc);
309cdf0e10cSrcweir 		sal_uInt16 nInsPos;
310cdf0e10cSrcweir 		if( aWordLst.Insert( pNew, nInsPos ) )
311cdf0e10cSrcweir 		{
312cdf0e10cSrcweir 			bRet = sal_True;
313cdf0e10cSrcweir 			if( aLRULst.Count() < nMaxCount )
314cdf0e10cSrcweir 				aLRULst.Insert( pNew, 0 );
315cdf0e10cSrcweir 			else
316cdf0e10cSrcweir 			{
317cdf0e10cSrcweir 				// der letzte muss entfernt werden
318cdf0e10cSrcweir 				// damit der neue vorne Platz hat
319cdf0e10cSrcweir 				String* pDel = (String*)aLRULst[ nMaxCount - 1 ];
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 				void** ppData = (void**)aLRULst.GetData();
322cdf0e10cSrcweir 				memmove( ppData+1, ppData, (nMaxCount - 1) * sizeof( void* ));
323cdf0e10cSrcweir 				*ppData = pNew;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 				aWordLst.Remove( pDel );
326cdf0e10cSrcweir                 delete (SwAutoCompleteString*)pDel;
327cdf0e10cSrcweir 			}
328cdf0e10cSrcweir 		}
329cdf0e10cSrcweir 		else
330cdf0e10cSrcweir 		{
331cdf0e10cSrcweir             delete (SwAutoCompleteString*)pNew;
332cdf0e10cSrcweir 			// dann aber auf jedenfall nach "oben" moven
333cdf0e10cSrcweir 			pNew = aWordLst[ nInsPos ];
334cdf0e10cSrcweir 
335cdf0e10cSrcweir             //add the document to the already inserted string
336cdf0e10cSrcweir             SwAutoCompleteString* pCurrent = (SwAutoCompleteString*)pNew;
337cdf0e10cSrcweir             pCurrent->AddDocument(rDoc);
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 			nInsPos = aLRULst.GetPos( (void*)pNew );
340cdf0e10cSrcweir 			ASSERT( USHRT_MAX != nInsPos, "String nicht gefunden" );
341cdf0e10cSrcweir 			if( nInsPos )
342cdf0e10cSrcweir 			{
343cdf0e10cSrcweir 				void** ppData = (void**)aLRULst.GetData();
344cdf0e10cSrcweir 				memmove( ppData+1, ppData, nInsPos * sizeof( void* ) );
345cdf0e10cSrcweir 				*ppData = pNew;
346cdf0e10cSrcweir 			}
347cdf0e10cSrcweir 		}
348cdf0e10cSrcweir 	}
349cdf0e10cSrcweir 	return bRet;
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
SetMaxCount(sal_uInt16 nNewMax)352cdf0e10cSrcweir void SwAutoCompleteWord::SetMaxCount( sal_uInt16 nNewMax )
353cdf0e10cSrcweir {
354cdf0e10cSrcweir 	if( nNewMax < nMaxCount && aLRULst.Count() > nNewMax )
355cdf0e10cSrcweir 	{
356cdf0e10cSrcweir 		// dann die unten ueberhaengenden entfernen
357cdf0e10cSrcweir 		sal_uInt16 nLRUIndex = nNewMax-1;
358cdf0e10cSrcweir 		while( nNewMax < aWordLst.Count() && nLRUIndex < aLRULst.Count())
359cdf0e10cSrcweir 		{
360cdf0e10cSrcweir 			sal_uInt16 nPos = aWordLst.GetPos( (String*)aLRULst[ nLRUIndex++ ] );
361cdf0e10cSrcweir 			ASSERT( USHRT_MAX != nPos, "String nicht gefunden" );
362cdf0e10cSrcweir             void * pDel = aWordLst[nPos];
363cdf0e10cSrcweir             aWordLst.Remove(nPos);
364cdf0e10cSrcweir             delete (SwAutoCompleteString*)pDel;
365cdf0e10cSrcweir         }
366cdf0e10cSrcweir 		aLRULst.Remove( nNewMax-1, aLRULst.Count() - nNewMax );
367cdf0e10cSrcweir 	}
368cdf0e10cSrcweir 	nMaxCount = nNewMax;
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
SetMinWordLen(sal_uInt16 n)371cdf0e10cSrcweir void SwAutoCompleteWord::SetMinWordLen( sal_uInt16 n )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir 	// will man wirklich alle Worte, die kleiner als die neue Min Laenge
374cdf0e10cSrcweir 	// sind entfernen?
375cdf0e10cSrcweir 	// JP 02.02.99 - erstmal nicht.
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 	// JP 11.03.99 - mal testhalber eingebaut
378cdf0e10cSrcweir 	if( n < nMinWrdLen )
379cdf0e10cSrcweir 	{
380cdf0e10cSrcweir 		for( sal_uInt16 nPos = 0; nPos < aWordLst.Count(); ++nPos  )
381cdf0e10cSrcweir 			if( aWordLst[ nPos ]->Len() < n )
382cdf0e10cSrcweir 			{
383cdf0e10cSrcweir 				void* pDel = aWordLst[ nPos ];
384cdf0e10cSrcweir                 aWordLst.Remove(nPos);
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 				sal_uInt16 nDelPos = aLRULst.GetPos( pDel );
387cdf0e10cSrcweir 				ASSERT( USHRT_MAX != nDelPos, "String nicht gefunden" );
388cdf0e10cSrcweir 				aLRULst.Remove( nDelPos );
389cdf0e10cSrcweir 				--nPos;
390cdf0e10cSrcweir                 delete (SwAutoCompleteString*)pDel;
391cdf0e10cSrcweir             }
392cdf0e10cSrcweir 	}
393cdf0e10cSrcweir 
394cdf0e10cSrcweir 	nMinWrdLen = n;
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
GetRange(const String & rWord,sal_uInt16 & rStt,sal_uInt16 & rEnd) const397cdf0e10cSrcweir sal_Bool SwAutoCompleteWord::GetRange( const String& rWord, sal_uInt16& rStt,
398cdf0e10cSrcweir 									sal_uInt16& rEnd ) const
399cdf0e10cSrcweir {
400cdf0e10cSrcweir 	const StringPtr pStr = (StringPtr)&rWord;
401cdf0e10cSrcweir 	aWordLst.Seek_Entry( pStr, &rStt );
402cdf0e10cSrcweir 	rEnd = rStt;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 	const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
405cdf0e10cSrcweir 	while( rEnd < aWordLst.Count() && rSCmp.isMatch( rWord, *aWordLst[ rEnd ]))
406cdf0e10cSrcweir 		++rEnd;
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 	return rStt < rEnd;
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
CheckChangedList(const SvStringsISortDtor & rNewLst)411cdf0e10cSrcweir void SwAutoCompleteWord::CheckChangedList( const SvStringsISortDtor& rNewLst )
412cdf0e10cSrcweir {
413cdf0e10cSrcweir 	sal_uInt16 nMyLen = aWordLst.Count(), nNewLen = rNewLst.Count();
414cdf0e10cSrcweir 	sal_uInt16 nMyPos = 0, nNewPos = 0;
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 	for( ; nMyPos < nMyLen && nNewPos < nNewLen; ++nMyPos, ++nNewPos )
417cdf0e10cSrcweir 	{
418cdf0e10cSrcweir 		const StringPtr pStr = rNewLst[ nNewPos ];
419cdf0e10cSrcweir 		while( aWordLst[ nMyPos ] != pStr )
420cdf0e10cSrcweir 		{
421cdf0e10cSrcweir 			void* pDel = aWordLst[ nMyPos ];
422cdf0e10cSrcweir             aWordLst.Remove(nMyPos);
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 			sal_uInt16 nPos = aLRULst.GetPos( pDel );
425cdf0e10cSrcweir 			ASSERT( USHRT_MAX != nPos, "String nicht gefunden" );
426cdf0e10cSrcweir 			aLRULst.Remove( nPos );
427cdf0e10cSrcweir             delete (SwAutoCompleteString*)pDel;
428cdf0e10cSrcweir             if( nMyPos >= --nMyLen )
429cdf0e10cSrcweir 				break;
430cdf0e10cSrcweir 		}
431cdf0e10cSrcweir 	}
432cdf0e10cSrcweir     //remove the elements at the end of the array
433cdf0e10cSrcweir     if( nMyPos < nMyLen )
434cdf0e10cSrcweir 	{
435cdf0e10cSrcweir         //clear LRU array first then delete the string object
436cdf0e10cSrcweir         for( ; nNewPos < nMyLen; ++nNewPos )
437cdf0e10cSrcweir 		{
438cdf0e10cSrcweir 			void* pDel = aWordLst[ nNewPos ];
439cdf0e10cSrcweir 			sal_uInt16 nPos = aLRULst.GetPos( pDel );
440cdf0e10cSrcweir 			ASSERT( USHRT_MAX != nPos, "String nicht gefunden" );
441cdf0e10cSrcweir 			aLRULst.Remove( nPos );
442cdf0e10cSrcweir             delete (SwAutoCompleteString*)pDel;
443cdf0e10cSrcweir 		}
444cdf0e10cSrcweir         //remove from array
445cdf0e10cSrcweir         aWordLst.Remove( nMyPos, nMyLen - nMyPos );
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir }
448cdf0e10cSrcweir /* -----------------------------05.08.2002 12:54------------------------------
449cdf0e10cSrcweir 
450cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
DocumentDying(const SwDoc & rDoc)451cdf0e10cSrcweir void SwAutoCompleteWord::DocumentDying(const SwDoc& rDoc)
452cdf0e10cSrcweir {
453cdf0e10cSrcweir     pImpl->RemoveDocument(rDoc);
454cdf0e10cSrcweir 
455cdf0e10cSrcweir     SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get()->GetAutoCorrect();
456cdf0e10cSrcweir     const sal_Bool bDelete = !pACorr->GetSwFlags().bAutoCmpltKeepList;
457cdf0e10cSrcweir     for(sal_uInt16 nPos = aWordLst.Count(); nPos; nPos--)
458cdf0e10cSrcweir     {
459cdf0e10cSrcweir         SwAutoCompleteString* pCurrent = (SwAutoCompleteString*)aWordLst[ nPos - 1 ];
460cdf0e10cSrcweir         if(pCurrent->RemoveDocument(rDoc) && bDelete)
461cdf0e10cSrcweir         {
462cdf0e10cSrcweir             aWordLst.Remove( nPos - 1 );
463cdf0e10cSrcweir             sal_uInt16 nLRUPos = aLRULst.GetPos( (void*)pCurrent );
464cdf0e10cSrcweir             DBG_ASSERT(nLRUPos < USHRT_MAX, "word not found in LRU list" );
465cdf0e10cSrcweir             aLRULst.Remove( nLRUPos );
466cdf0e10cSrcweir             delete pCurrent;
467cdf0e10cSrcweir         }
468cdf0e10cSrcweir     }
469cdf0e10cSrcweir }
470cdf0e10cSrcweir 
471