xref: /aoo41x/main/editeng/source/misc/splwrap.cxx (revision ca4a1848)
1190118d0SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3190118d0SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4190118d0SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5190118d0SAndrew Rist  * distributed with this work for additional information
6190118d0SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7190118d0SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8190118d0SAndrew Rist  * "License"); you may not use this file except in compliance
9190118d0SAndrew Rist  * with the License.  You may obtain a copy of the License at
10190118d0SAndrew Rist  *
11190118d0SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12190118d0SAndrew Rist  *
13190118d0SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14190118d0SAndrew Rist  * software distributed under the License is distributed on an
15190118d0SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16190118d0SAndrew Rist  * KIND, either express or implied.  See the License for the
17190118d0SAndrew Rist  * specific language governing permissions and limitations
18190118d0SAndrew Rist  * under the License.
19190118d0SAndrew Rist  *
20190118d0SAndrew Rist  *************************************************************/
21190118d0SAndrew Rist 
22190118d0SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_editeng.hxx"
26cdf0e10cSrcweir #include<rtl/ustring.hxx>
27cdf0e10cSrcweir #include <tools/shl.hxx>
28cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
29cdf0e10cSrcweir #include <vcl/svapp.hxx>
30cdf0e10cSrcweir #include <vcl/msgbox.hxx>
31cdf0e10cSrcweir #include <tools/debug.hxx>
32cdf0e10cSrcweir #include <svtools/langtab.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #ifndef __RSC
35cdf0e10cSrcweir #include <tools/errinf.hxx>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #include <editeng/unolingu.hxx>
38cdf0e10cSrcweir #include <linguistic/lngprops.hxx>
39cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <map>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include <editeng/svxenum.hxx>
44cdf0e10cSrcweir #include <editeng/splwrap.hxx>      // Der Wrapper
45cdf0e10cSrcweir #include <editeng/edtdlg.hxx>
46cdf0e10cSrcweir #include <editeng/eerdll.hxx>
47cdf0e10cSrcweir #include <editeng/editrids.hrc>
48cdf0e10cSrcweir #include <editeng/editids.hrc>
49cdf0e10cSrcweir #include <editeng/editerr.hxx>
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #define WAIT_ON() if(pWin != NULL) { pWin->EnterWait(); }
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #define WAIT_OFF() if(pWin != NULL) { pWin->LeaveWait(); }
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace ::com::sun::star;
56cdf0e10cSrcweir using namespace ::com::sun::star::uno;
57cdf0e10cSrcweir using namespace ::com::sun::star::beans;
58cdf0e10cSrcweir using namespace ::com::sun::star::linguistic2;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 
61cdf0e10cSrcweir // misc functions ---------------------------------------------
62cdf0e10cSrcweir 
SvxPrepareAutoCorrect(String & rOldText,String & rNewText)63cdf0e10cSrcweir void SvxPrepareAutoCorrect( String &rOldText, String &rNewText )
64cdf0e10cSrcweir {
65cdf0e10cSrcweir 	// This function should be used to strip (or add) trailing '.' from
66cdf0e10cSrcweir 	// the strings before passing them on to the autocorrect function in
67cdf0e10cSrcweir 	// order that the autocorrect function will hopefully
68cdf0e10cSrcweir 	// works properly with normal words and abbreviations (with trailing '.')
69cdf0e10cSrcweir 	// independ of if they are at the end of the sentence or not.
70cdf0e10cSrcweir 	//
71cdf0e10cSrcweir 	// rOldText: text to be replaced
72cdf0e10cSrcweir 	// rNewText: replacement text
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 	xub_StrLen	nOldLen = rOldText.Len(),
75cdf0e10cSrcweir 				nNewLen = rNewText.Len();
76cdf0e10cSrcweir 	if (nOldLen && nNewLen)
77cdf0e10cSrcweir 	{
78cdf0e10cSrcweir 		sal_Bool bOldHasDot = sal_Unicode( '.' ) == rOldText.GetChar( nOldLen - 1 ),
79cdf0e10cSrcweir 			 bNewHasDot = sal_Unicode( '.' ) == rNewText.GetChar( nNewLen - 1 );
80cdf0e10cSrcweir 		if (bOldHasDot && !bNewHasDot
81cdf0e10cSrcweir 			/*this is: !(bOldHasDot && bNewHasDot) && bOldHasDot*/)
82cdf0e10cSrcweir 			rOldText.Erase( nOldLen - 1 );
83cdf0e10cSrcweir 	}
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
86cdf0e10cSrcweir // -----------------------------------------------------------------------
87cdf0e10cSrcweir 
88cdf0e10cSrcweir #define SVX_LANG_NEED_CHECK			0
89cdf0e10cSrcweir #define SVX_LANG_OK					1
90cdf0e10cSrcweir #define SVX_LANG_MISSING			2
91cdf0e10cSrcweir #define SVX_LANG_MISSING_DO_WARN	3
92cdf0e10cSrcweir 
93cdf0e10cSrcweir #define SVX_FLAGS_NEW
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 
96cdf0e10cSrcweir struct lt_LanguageType
97cdf0e10cSrcweir {
operator ()lt_LanguageType98cdf0e10cSrcweir     bool operator()( LanguageType n1, LanguageType n2 ) const
99cdf0e10cSrcweir     {
100cdf0e10cSrcweir         return n1 < n2;
101cdf0e10cSrcweir     }
102cdf0e10cSrcweir };
103cdf0e10cSrcweir 
104cdf0e10cSrcweir typedef std::map< LanguageType, sal_uInt16, lt_LanguageType >   LangCheckState_map_t;
105cdf0e10cSrcweir 
GetLangCheckState()106cdf0e10cSrcweir static LangCheckState_map_t & GetLangCheckState()
107cdf0e10cSrcweir {
108cdf0e10cSrcweir     static LangCheckState_map_t aLangCheckState;
109cdf0e10cSrcweir     return aLangCheckState;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir 
ShowLanguageErrors()112cdf0e10cSrcweir void SvxSpellWrapper::ShowLanguageErrors()
113cdf0e10cSrcweir {
114cdf0e10cSrcweir     // display message boxes for languages not available for
115cdf0e10cSrcweir     // spellchecking or hyphenation
116cdf0e10cSrcweir     LangCheckState_map_t &rLCS = GetLangCheckState();
117cdf0e10cSrcweir     LangCheckState_map_t::iterator aIt( rLCS.begin() );
118cdf0e10cSrcweir     while (aIt != rLCS.end())
119cdf0e10cSrcweir 	{
120cdf0e10cSrcweir         LanguageType nLang = aIt->first;
121cdf0e10cSrcweir         sal_uInt16   nVal  = aIt->second;
122cdf0e10cSrcweir 		sal_uInt16 nTmpSpell = nVal & 0x00FF;
123cdf0e10cSrcweir 		sal_uInt16 nTmpHyph  = (nVal >> 8) & 0x00FF;
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 		if (SVX_LANG_MISSING_DO_WARN == nTmpSpell)
126cdf0e10cSrcweir 		{
127cdf0e10cSrcweir 			String aErr( SvtLanguageTable::GetLanguageString( nLang ) );
128cdf0e10cSrcweir 			ErrorHandler::HandleError(
129cdf0e10cSrcweir 				*new StringErrorInfo( ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aErr ) );
130cdf0e10cSrcweir 			nTmpSpell = SVX_LANG_MISSING;
131cdf0e10cSrcweir 		}
132cdf0e10cSrcweir 		if (SVX_LANG_MISSING_DO_WARN == nTmpHyph)
133cdf0e10cSrcweir 		{
134cdf0e10cSrcweir 			String aErr( SvtLanguageTable::GetLanguageString( nLang ) );
135cdf0e10cSrcweir 			ErrorHandler::HandleError(
136cdf0e10cSrcweir 				*new StringErrorInfo( ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aErr ) );
137cdf0e10cSrcweir 			nTmpHyph = SVX_LANG_MISSING;
138cdf0e10cSrcweir 		}
139cdf0e10cSrcweir 
140cdf0e10cSrcweir         rLCS[ nLang ] = (nTmpHyph << 8) | nTmpSpell;
141cdf0e10cSrcweir         ++aIt;
142cdf0e10cSrcweir 	}
143cdf0e10cSrcweir 
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
~SvxSpellWrapper()146cdf0e10cSrcweir SvxSpellWrapper::~SvxSpellWrapper()
147cdf0e10cSrcweir {
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir /*--------------------------------------------------------------------
151cdf0e10cSrcweir  *	Beschreibung: Ctor, die Pruefreihenfolge wird festgelegt
152cdf0e10cSrcweir  *
153cdf0e10cSrcweir  *  !bStart && !bOtherCntnt:	BODY_END,	BODY_START,	OTHER
154cdf0e10cSrcweir  *  !bStart && bOtherCntnt:		OTHER,		BODY
155cdf0e10cSrcweir  *  bStart && !bOtherCntnt:		BODY_END,	OTHER
156cdf0e10cSrcweir  *  bStart && bOtherCntnt:		OTHER
157cdf0e10cSrcweir  *
158cdf0e10cSrcweir  --------------------------------------------------------------------*/
159cdf0e10cSrcweir 
SvxSpellWrapper(Window * pWn,Reference<XSpellChecker1> & xSpellChecker,const sal_Bool bStart,const sal_Bool bIsAllRight,const sal_Bool bOther,const sal_Bool bRevAllow)160cdf0e10cSrcweir SvxSpellWrapper::SvxSpellWrapper( Window* pWn,
161cdf0e10cSrcweir 	Reference< XSpellChecker1 >  &xSpellChecker,
162cdf0e10cSrcweir 	const sal_Bool bStart, const sal_Bool bIsAllRight,
163cdf0e10cSrcweir 	const sal_Bool bOther, const sal_Bool bRevAllow ) :
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 	pWin		( pWn ),
166cdf0e10cSrcweir 	xSpell		( xSpellChecker ),
167*ca4a1848SPavel Janík 	mpTextObj( NULL),
168cdf0e10cSrcweir 	bOtherCntnt	( bOther ),
169cdf0e10cSrcweir 	bDialog		( sal_False ),
170cdf0e10cSrcweir 	bHyphen		( sal_False ),
171cdf0e10cSrcweir 	bAuto		( sal_False ),
172cdf0e10cSrcweir 	bStartChk	( bOther ),
173cdf0e10cSrcweir     bRevAllowed ( bRevAllow ),
174cdf0e10cSrcweir     bAllRight   ( bIsAllRight )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir 	Reference< beans::XPropertySet >  xProp( SvxGetLinguPropertySet() );
177cdf0e10cSrcweir 	sal_Bool bWrapReverse = xProp.is() ?
178cdf0e10cSrcweir 		*(sal_Bool*)xProp->getPropertyValue(
179cdf0e10cSrcweir 			::rtl::OUString::createFromAscii(UPN_IS_WRAP_REVERSE) ).getValue()
180cdf0e10cSrcweir 		: sal_False;
181cdf0e10cSrcweir 	bReverse = bRevAllow && bWrapReverse;
182cdf0e10cSrcweir 	bStartDone = bOther || ( !bReverse && bStart );
183cdf0e10cSrcweir 	bEndDone   = bReverse && bStart && !bOther;
184cdf0e10cSrcweir }
185cdf0e10cSrcweir 
186cdf0e10cSrcweir // -----------------------------------------------------------------------
187cdf0e10cSrcweir 
SvxSpellWrapper(Window * pWn,Reference<XHyphenator> & xHyphenator,const sal_Bool bStart,const sal_Bool bOther)188cdf0e10cSrcweir SvxSpellWrapper::SvxSpellWrapper( Window* pWn,
189cdf0e10cSrcweir 		Reference< XHyphenator >  &xHyphenator,
190cdf0e10cSrcweir 		const sal_Bool bStart, const sal_Bool bOther ) :
191cdf0e10cSrcweir 	pWin		( pWn ),
192cdf0e10cSrcweir 	xHyph		( xHyphenator ),
193*ca4a1848SPavel Janík 	mpTextObj( NULL),
194cdf0e10cSrcweir 	bOtherCntnt	( bOther ),
195cdf0e10cSrcweir 	bDialog		( sal_False ),
196cdf0e10cSrcweir 	bHyphen		( sal_False ),
197cdf0e10cSrcweir 	bAuto		( sal_False ),
198cdf0e10cSrcweir 	bReverse	( sal_False ),
199cdf0e10cSrcweir 	bStartDone	( bOther || ( !bReverse && bStart ) ),
200cdf0e10cSrcweir 	bEndDone	( bReverse && bStart && !bOther ),
201cdf0e10cSrcweir 	bStartChk	( bOther ),
202cdf0e10cSrcweir     bRevAllowed ( sal_False ),
203cdf0e10cSrcweir     bAllRight   ( sal_True )
204cdf0e10cSrcweir {
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir // -----------------------------------------------------------------------
208cdf0e10cSrcweir 
CheckSpellLang(Reference<XSpellChecker1> xSpell,sal_Int16 nLang)209cdf0e10cSrcweir sal_Int16 SvxSpellWrapper::CheckSpellLang(
210cdf0e10cSrcweir 		Reference< XSpellChecker1 > xSpell, sal_Int16 nLang)
211cdf0e10cSrcweir {
212cdf0e10cSrcweir     LangCheckState_map_t &rLCS = GetLangCheckState();
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     LangCheckState_map_t::iterator aIt( rLCS.find( nLang ) );
215cdf0e10cSrcweir     sal_uInt16 nVal = aIt == rLCS.end() ? SVX_LANG_NEED_CHECK : aIt->second;
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     if (aIt == rLCS.end())
218cdf0e10cSrcweir         rLCS[ nLang ] = nVal;
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 	if (SVX_LANG_NEED_CHECK == (nVal & 0x00FF))
221cdf0e10cSrcweir 	{
222cdf0e10cSrcweir 		sal_uInt16 nTmpVal = SVX_LANG_MISSING_DO_WARN;
223cdf0e10cSrcweir 		if (xSpell.is()  &&  xSpell->hasLanguage( nLang ))
224cdf0e10cSrcweir 			nTmpVal = SVX_LANG_OK;
225cdf0e10cSrcweir 		nVal &= 0xFF00;
226cdf0e10cSrcweir 		nVal |= nTmpVal;
227cdf0e10cSrcweir 
228cdf0e10cSrcweir         rLCS[ nLang ] = nVal;
229cdf0e10cSrcweir 	}
230cdf0e10cSrcweir 
231cdf0e10cSrcweir     return (sal_Int16) nVal;
232cdf0e10cSrcweir }
233cdf0e10cSrcweir 
CheckHyphLang(Reference<XHyphenator> xHyph,sal_Int16 nLang)234cdf0e10cSrcweir sal_Int16 SvxSpellWrapper::CheckHyphLang(
235cdf0e10cSrcweir 		Reference< XHyphenator >  xHyph, sal_Int16 nLang)
236cdf0e10cSrcweir {
237cdf0e10cSrcweir     LangCheckState_map_t &rLCS = GetLangCheckState();
238cdf0e10cSrcweir 
239cdf0e10cSrcweir     LangCheckState_map_t::iterator aIt( rLCS.find( nLang ) );
240cdf0e10cSrcweir     sal_uInt16 nVal = aIt == rLCS.end() ? 0 : aIt->second;
241cdf0e10cSrcweir 
242cdf0e10cSrcweir     if (aIt == rLCS.end())
243cdf0e10cSrcweir         rLCS[ nLang ] = nVal;
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 	if (SVX_LANG_NEED_CHECK == ((nVal >> 8) & 0x00FF))
246cdf0e10cSrcweir 	{
247cdf0e10cSrcweir 		sal_uInt16 nTmpVal = SVX_LANG_MISSING_DO_WARN;
248cdf0e10cSrcweir 		if (xHyph.is()  &&  xHyph->hasLocale( SvxCreateLocale( nLang ) ))
249cdf0e10cSrcweir 			nTmpVal = SVX_LANG_OK;
250cdf0e10cSrcweir 		nVal &= 0x00FF;
251cdf0e10cSrcweir 		nVal |= nTmpVal << 8;
252cdf0e10cSrcweir 
253cdf0e10cSrcweir         rLCS[ nLang ] = nVal;
254cdf0e10cSrcweir 	}
255cdf0e10cSrcweir 
256cdf0e10cSrcweir     return (sal_Int16) nVal;
257cdf0e10cSrcweir }
258cdf0e10cSrcweir 
259cdf0e10cSrcweir // -----------------------------------------------------------------------
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 
SpellStart(SvxSpellArea)262cdf0e10cSrcweir void SvxSpellWrapper::SpellStart( SvxSpellArea /*eSpell*/ )
263cdf0e10cSrcweir {	// Hier muessen die notwendigen Vorbereitungen fuer SpellContinue
264cdf0e10cSrcweir }	// im uebergebenen Bereich getroffen werden.
265cdf0e10cSrcweir 
266cdf0e10cSrcweir // -----------------------------------------------------------------------
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 
HasOtherCnt()269cdf0e10cSrcweir sal_Bool SvxSpellWrapper::HasOtherCnt()
270cdf0e10cSrcweir {
271cdf0e10cSrcweir 	return sal_False; // Gibt es ueberhaupt einen Sonderbereich?
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir // -----------------------------------------------------------------------
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 
SpellMore()277cdf0e10cSrcweir sal_Bool SvxSpellWrapper::SpellMore()
278cdf0e10cSrcweir {
279cdf0e10cSrcweir 	return sal_False; // Sollen weitere Dokumente geprueft werden?
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir // -----------------------------------------------------------------------
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 
SpellEnd()285cdf0e10cSrcweir void SvxSpellWrapper::SpellEnd()
286cdf0e10cSrcweir {	// Bereich ist abgeschlossen, ggf. Aufraeumen
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     // display error for last language not found
289cdf0e10cSrcweir     ShowLanguageErrors();
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir // -----------------------------------------------------------------------
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 
SpellContinue()295cdf0e10cSrcweir sal_Bool SvxSpellWrapper::SpellContinue()
296cdf0e10cSrcweir {
297cdf0e10cSrcweir 	return sal_False;
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
300cdf0e10cSrcweir // -----------------------------------------------------------------------
301cdf0e10cSrcweir 
AutoCorrect(const String &,const String &)302cdf0e10cSrcweir void SvxSpellWrapper::AutoCorrect( const String&, const String& )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir // -----------------------------------------------------------------------
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 
ScrollArea()309cdf0e10cSrcweir void SvxSpellWrapper::ScrollArea()
310cdf0e10cSrcweir {	// Scrollarea einstellen
311cdf0e10cSrcweir }
312cdf0e10cSrcweir 
313cdf0e10cSrcweir // -----------------------------------------------------------------------
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 
ChangeWord(const String &,const sal_uInt16)316cdf0e10cSrcweir void SvxSpellWrapper::ChangeWord( const String&, const sal_uInt16 )
317cdf0e10cSrcweir {	// Wort ersetzen
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir // -----------------------------------------------------------------------
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 
GetThesWord()323cdf0e10cSrcweir String SvxSpellWrapper::GetThesWord()
324cdf0e10cSrcweir {
325cdf0e10cSrcweir 	// Welches Wort soll nachgeschlagen werden?
326cdf0e10cSrcweir 	return String();
327cdf0e10cSrcweir }
328cdf0e10cSrcweir 
329cdf0e10cSrcweir // -----------------------------------------------------------------------
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 
ChangeThesWord(const String &)332cdf0e10cSrcweir void SvxSpellWrapper::ChangeThesWord( const String& )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir 	// Wort wg. Thesaurus ersetzen
335cdf0e10cSrcweir }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir // -----------------------------------------------------------------------
338cdf0e10cSrcweir 
StartThesaurus(const String & rWord,sal_uInt16 nLanguage)339cdf0e10cSrcweir void SvxSpellWrapper::StartThesaurus( const String &rWord, sal_uInt16 nLanguage )
340cdf0e10cSrcweir {
341cdf0e10cSrcweir 	Reference< XThesaurus >  xThes( SvxGetThesaurus() );
342cdf0e10cSrcweir 	if (!xThes.is())
343cdf0e10cSrcweir 	{
344cdf0e10cSrcweir 		InfoBox( pWin, EE_RESSTR( RID_SVXSTR_HMERR_THESAURUS ) ).Execute();
345cdf0e10cSrcweir 		return;
346cdf0e10cSrcweir 	}
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	WAIT_ON();	// while looking up for initial word
349cdf0e10cSrcweir 	EditAbstractDialogFactory* pFact = EditAbstractDialogFactory::Create();
350cdf0e10cSrcweir 	AbstractThesaurusDialog* pDlg = pFact->CreateThesaurusDialog( pWin, xThes, rWord, nLanguage );
351cdf0e10cSrcweir 	WAIT_OFF();
352cdf0e10cSrcweir 	if ( pDlg->Execute()== RET_OK )
353cdf0e10cSrcweir 	{
354cdf0e10cSrcweir 		ChangeThesWord( pDlg->GetWord() );
355cdf0e10cSrcweir 	}
356cdf0e10cSrcweir 	delete pDlg;
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir // -----------------------------------------------------------------------
360cdf0e10cSrcweir 
ReplaceAll(const String &,sal_Int16)361cdf0e10cSrcweir void SvxSpellWrapper::ReplaceAll( const String &, sal_Int16 )
362cdf0e10cSrcweir {	// Wort aus der Replace-Liste ersetzen
363cdf0e10cSrcweir }
364cdf0e10cSrcweir 
365cdf0e10cSrcweir // -----------------------------------------------------------------------
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 
SetLanguage(const sal_uInt16)368cdf0e10cSrcweir void SvxSpellWrapper::SetLanguage( const sal_uInt16 )
369cdf0e10cSrcweir {	// Sprache aendern
370cdf0e10cSrcweir }
371cdf0e10cSrcweir 
372cdf0e10cSrcweir // -----------------------------------------------------------------------
373cdf0e10cSrcweir 
374cdf0e10cSrcweir 
InsertHyphen(const sal_uInt16)375cdf0e10cSrcweir void SvxSpellWrapper::InsertHyphen( const sal_uInt16 )
376cdf0e10cSrcweir {	// Hyphen einfuegen bzw. loeschen
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir // -----------------------------------------------------------------------
380cdf0e10cSrcweir // Pruefung der Dokumentbereiche in der durch die Flags angegebenen Reihenfolge
381cdf0e10cSrcweir 
382cdf0e10cSrcweir 
SpellDocument()383cdf0e10cSrcweir void SvxSpellWrapper::SpellDocument( )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir 	if ( bOtherCntnt )
386cdf0e10cSrcweir 	{
387cdf0e10cSrcweir 		bReverse = sal_False;
388cdf0e10cSrcweir 		SpellStart( SVX_SPELL_OTHER );
389cdf0e10cSrcweir 	}
390cdf0e10cSrcweir 	else
391cdf0e10cSrcweir 	{
392cdf0e10cSrcweir 		bStartChk = bReverse;
393cdf0e10cSrcweir 		SpellStart( bReverse ? SVX_SPELL_BODY_START : SVX_SPELL_BODY_END );
394cdf0e10cSrcweir 	}
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 	if ( FindSpellError() )
397cdf0e10cSrcweir 	{
398cdf0e10cSrcweir 		Reference< XSpellAlternatives >  	xAlt( GetLast(), UNO_QUERY );
399cdf0e10cSrcweir 		Reference< XHyphenatedWord > 		xHyphWord( GetLast(), UNO_QUERY );
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 		Window *pOld = pWin;
402cdf0e10cSrcweir 		bDialog = sal_True;
403cdf0e10cSrcweir 		if (xHyphWord.is())
404cdf0e10cSrcweir 		{
405cdf0e10cSrcweir 			EditAbstractDialogFactory* pFact = EditAbstractDialogFactory::Create();
406cdf0e10cSrcweir 			AbstractHyphenWordDialog* pDlg = pFact->CreateHyphenWordDialog( pWin,
407cdf0e10cSrcweir 							xHyphWord->getWord(),
408cdf0e10cSrcweir 							SvxLocaleToLanguage( xHyphWord->getLocale() ),
409cdf0e10cSrcweir 							xHyph, this );
410cdf0e10cSrcweir 			pWin = pDlg->GetWindow();
411cdf0e10cSrcweir 			pDlg->Execute();
412cdf0e10cSrcweir 			delete pDlg;
413cdf0e10cSrcweir 		}
414cdf0e10cSrcweir 		bDialog = sal_False;
415cdf0e10cSrcweir 		pWin = pOld;
416cdf0e10cSrcweir 	};
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir // -----------------------------------------------------------------------
420cdf0e10cSrcweir // Naechsten Bereich auswaehlen
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 
SpellNext()423cdf0e10cSrcweir sal_Bool SvxSpellWrapper::SpellNext( )
424cdf0e10cSrcweir {
425cdf0e10cSrcweir 	Reference< beans::XPropertySet >  xProp( SvxGetLinguPropertySet() );
426cdf0e10cSrcweir 	sal_Bool bWrapReverse = xProp.is() ?
427cdf0e10cSrcweir 			*(sal_Bool*)xProp->getPropertyValue(
428cdf0e10cSrcweir 				::rtl::OUString::createFromAscii(UPN_IS_WRAP_REVERSE) ).getValue()
429cdf0e10cSrcweir 			: sal_False;
430cdf0e10cSrcweir 	sal_Bool bActRev = bRevAllowed && bWrapReverse;
431cdf0e10cSrcweir 
432cdf0e10cSrcweir 	// bActRev ist die Richtung nach dem Spellen, bReverse die am Anfang.
433cdf0e10cSrcweir 	if( bActRev == bReverse )
434cdf0e10cSrcweir 	{   						// Keine Richtungsaenderung, also ist
435cdf0e10cSrcweir 		if( bStartChk )         // der gewuenschte Bereich ( bStartChk )
436cdf0e10cSrcweir 			bStartDone = sal_True;  // vollstaendig abgearbeitet.
437cdf0e10cSrcweir 		else
438cdf0e10cSrcweir 			bEndDone = sal_True;
439cdf0e10cSrcweir 	}
440cdf0e10cSrcweir 	else if( bReverse == bStartChk ) // Bei einer Richtungsaenderung kann
441cdf0e10cSrcweir 	{ 						   // u.U. auch ein Bereich abgearbeitet sein.
442cdf0e10cSrcweir 		if( bStartChk )        // Sollte der vordere Teil rueckwaerts gespellt
443cdf0e10cSrcweir 			bEndDone = sal_True;   // werden und wir kehren unterwegs um, so ist
444cdf0e10cSrcweir 		else				   // der hintere Teil abgearbeitet (und umgekehrt).
445cdf0e10cSrcweir 			bStartDone = sal_True;
446cdf0e10cSrcweir 	}
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 	bReverse = bActRev;
449cdf0e10cSrcweir 	if( bOtherCntnt && bStartDone && bEndDone ) // Dokument komplett geprueft?
450cdf0e10cSrcweir 	{
451cdf0e10cSrcweir 		if ( SpellMore() )  // ein weiteres Dokument pruefen?
452cdf0e10cSrcweir 		{
453cdf0e10cSrcweir 			bOtherCntnt = sal_False;
454cdf0e10cSrcweir 			bStartDone = !bReverse;
455cdf0e10cSrcweir 			bEndDone  = bReverse;
456cdf0e10cSrcweir 			SpellStart( SVX_SPELL_BODY );
457cdf0e10cSrcweir 			return sal_True;
458cdf0e10cSrcweir 		}
459cdf0e10cSrcweir 		return sal_False;
460cdf0e10cSrcweir 	}
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 	sal_Bool bGoOn = sal_False;
463cdf0e10cSrcweir 
464cdf0e10cSrcweir 	if ( bOtherCntnt )
465cdf0e10cSrcweir 	{
466cdf0e10cSrcweir 		bStartChk = sal_False;
467cdf0e10cSrcweir 		SpellStart( SVX_SPELL_BODY );
468cdf0e10cSrcweir 		bGoOn = sal_True;
469cdf0e10cSrcweir 	}
470cdf0e10cSrcweir 	else if ( bStartDone && bEndDone )
471cdf0e10cSrcweir 	{
472cdf0e10cSrcweir 		sal_Bool bIsSpellSpecial = xProp.is() ?
473cdf0e10cSrcweir 			*(sal_Bool*)xProp->getPropertyValue(
474cdf0e10cSrcweir 				::rtl::OUString::createFromAscii(UPN_IS_SPELL_SPECIAL) ).getValue()
475cdf0e10cSrcweir 			: sal_False;
476cdf0e10cSrcweir 		// Bodybereich erledigt, Frage nach Sonderbereich
477cdf0e10cSrcweir 		if( !IsHyphen() && bIsSpellSpecial && HasOtherCnt() )
478cdf0e10cSrcweir 		{
479cdf0e10cSrcweir 			SpellStart( SVX_SPELL_OTHER );
480cdf0e10cSrcweir 			bOtherCntnt = bGoOn = sal_True;
481cdf0e10cSrcweir 		}
482cdf0e10cSrcweir 		else if ( SpellMore() )  // ein weiteres Dokument pruefen?
483cdf0e10cSrcweir 		{
484cdf0e10cSrcweir 			bOtherCntnt = sal_False;
485cdf0e10cSrcweir 			bStartDone = !bReverse;
486cdf0e10cSrcweir 			bEndDone  = bReverse;
487cdf0e10cSrcweir 			SpellStart( SVX_SPELL_BODY );
488cdf0e10cSrcweir 			return sal_True;
489cdf0e10cSrcweir 		}
490cdf0e10cSrcweir 	}
491cdf0e10cSrcweir 	else
492cdf0e10cSrcweir 	{
493cdf0e10cSrcweir 		// Ein BODY_Bereich erledigt, Frage nach dem anderen BODY_Bereich
494cdf0e10cSrcweir 		WAIT_OFF();
495cdf0e10cSrcweir 
496cdf0e10cSrcweir // Sobald im Dialog das DontWrapAround gesetzt werden kann, kann der
497cdf0e10cSrcweir // folgende #ifdef-Zweig aktiviert werden ...
498cdf0e10cSrcweir #ifdef USED
499cdf0e10cSrcweir 		sal_Bool bDontWrapAround = IsHyphen() ?
500cdf0e10cSrcweir 			pSpell->GetOptions() & DONT_WRAPAROUND :
501cdf0e10cSrcweir 			pSpell->GetHyphOptions() & HYPH_DONT_WRAPAROUND;
502cdf0e10cSrcweir 		if( bDontWrapAround )
503cdf0e10cSrcweir #else
504cdf0e10cSrcweir 		sal_uInt16 nResId = bReverse ? RID_SVXQB_BW_CONTINUE : RID_SVXQB_CONTINUE;
505cdf0e10cSrcweir 		QueryBox aBox( pWin, EditResId( nResId ) );
506cdf0e10cSrcweir 		if ( aBox.Execute() != RET_YES )
507cdf0e10cSrcweir #endif
508cdf0e10cSrcweir 
509cdf0e10cSrcweir 		{
510cdf0e10cSrcweir 			// Verzicht auf den anderen Bereich, ggf. Frage nach Sonderbereich
511cdf0e10cSrcweir 			WAIT_ON();
512cdf0e10cSrcweir 			bStartDone = bEndDone = sal_True;
513cdf0e10cSrcweir 			return SpellNext();
514cdf0e10cSrcweir 		}
515cdf0e10cSrcweir 		else
516cdf0e10cSrcweir 		{
517cdf0e10cSrcweir 			bStartChk = !bStartDone;
518cdf0e10cSrcweir 			SpellStart( bStartChk ? SVX_SPELL_BODY_START : SVX_SPELL_BODY_END );
519cdf0e10cSrcweir 			bGoOn = sal_True;
520cdf0e10cSrcweir 		}
521cdf0e10cSrcweir 		WAIT_ON();
522cdf0e10cSrcweir 	}
523cdf0e10cSrcweir 	return bGoOn;
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir // -----------------------------------------------------------------------
527cdf0e10cSrcweir 
GetAllRightDic() const528cdf0e10cSrcweir Reference< XDictionary >  SvxSpellWrapper::GetAllRightDic() const
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     Reference< XDictionary >  xDic;
531cdf0e10cSrcweir 
532cdf0e10cSrcweir 	Reference< XDictionaryList >  xDicList( SvxGetDictionaryList() );
533cdf0e10cSrcweir 	if (xDicList.is())
534cdf0e10cSrcweir 	{
535cdf0e10cSrcweir 		Sequence< Reference< XDictionary >  > aDics( xDicList->getDictionaries() );
536cdf0e10cSrcweir 		const Reference< XDictionary >  *pDic = aDics.getConstArray();
537cdf0e10cSrcweir 		sal_Int32 nCount = aDics.getLength();
538cdf0e10cSrcweir 
539cdf0e10cSrcweir 		sal_Int32 i = 0;
540cdf0e10cSrcweir 		while (!xDic.is()  &&  i < nCount)
541cdf0e10cSrcweir 		{
542cdf0e10cSrcweir             Reference< XDictionary >  xTmp( pDic[i], UNO_QUERY );
543cdf0e10cSrcweir 			if (xTmp.is())
544cdf0e10cSrcweir 			{
545cdf0e10cSrcweir 				if ( xTmp->isActive() &&
546cdf0e10cSrcweir 					 xTmp->getDictionaryType() != DictionaryType_NEGATIVE &&
547cdf0e10cSrcweir                      SvxLocaleToLanguage( xTmp->getLocale() ) == LANGUAGE_NONE )
548cdf0e10cSrcweir 				{
549cdf0e10cSrcweir 					Reference< frame::XStorable >  xStor( xTmp, UNO_QUERY );
550cdf0e10cSrcweir 					if (xStor.is() && xStor->hasLocation() && !xStor->isReadonly())
551cdf0e10cSrcweir 					{
552cdf0e10cSrcweir 						xDic = xTmp;
553cdf0e10cSrcweir 					}
554cdf0e10cSrcweir 				}
555cdf0e10cSrcweir 			}
556cdf0e10cSrcweir 			++i;
557cdf0e10cSrcweir 		}
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 		if (!xDic.is())
560cdf0e10cSrcweir 		{
561cdf0e10cSrcweir 			xDic = SvxGetOrCreatePosDic( xDicList );
562cdf0e10cSrcweir 			if (xDic.is())
563cdf0e10cSrcweir 				xDic->setActive( sal_True );
564cdf0e10cSrcweir 		}
565cdf0e10cSrcweir 	}
566cdf0e10cSrcweir 
567cdf0e10cSrcweir 	return xDic;
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir // -----------------------------------------------------------------------
571cdf0e10cSrcweir 
FindSpellError()572cdf0e10cSrcweir sal_Bool SvxSpellWrapper::FindSpellError()
573cdf0e10cSrcweir {
574cdf0e10cSrcweir     ShowLanguageErrors();
575cdf0e10cSrcweir 
576cdf0e10cSrcweir  	Reference< XInterface > 	xRef;
577cdf0e10cSrcweir 
578cdf0e10cSrcweir 	WAIT_ON();
579cdf0e10cSrcweir 	sal_Bool bSpell = sal_True;
580cdf0e10cSrcweir 
581cdf0e10cSrcweir     Reference< XDictionary >  xAllRightDic;
582cdf0e10cSrcweir 	if (IsAllRight())
583cdf0e10cSrcweir 		xAllRightDic = GetAllRightDic();
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 	while ( bSpell )
586cdf0e10cSrcweir 	{
587cdf0e10cSrcweir 		SpellContinue();
588cdf0e10cSrcweir 
589cdf0e10cSrcweir 		Reference< XSpellAlternatives >  	xAlt( GetLast(), UNO_QUERY );
590cdf0e10cSrcweir 		Reference< XHyphenatedWord > 		xHyphWord( GetLast(), UNO_QUERY );
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 		if (xAlt.is())
593cdf0e10cSrcweir 		{
594cdf0e10cSrcweir 			if (IsAllRight() && xAllRightDic.is())
595cdf0e10cSrcweir 			{
596cdf0e10cSrcweir 				xAllRightDic->add( xAlt->getWord(), sal_False, ::rtl::OUString() );
597cdf0e10cSrcweir 			}
598cdf0e10cSrcweir 			else
599cdf0e10cSrcweir 			{
600cdf0e10cSrcweir 				// look up in ChangeAllList for misspelled word
601cdf0e10cSrcweir                 Reference< XDictionary >    xChangeAllList(
602cdf0e10cSrcweir 						SvxGetChangeAllList(), UNO_QUERY );
603cdf0e10cSrcweir 				Reference< XDictionaryEntry > 	xEntry;
604cdf0e10cSrcweir 				if (xChangeAllList.is())
605cdf0e10cSrcweir 					xEntry = xChangeAllList->getEntry( xAlt->getWord() );
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 				if (xEntry.is())
608cdf0e10cSrcweir 				{
609cdf0e10cSrcweir 					// replace word without asking
610cdf0e10cSrcweir 					ReplaceAll( xEntry->getReplacementText(),
611cdf0e10cSrcweir 								SvxLocaleToLanguage( xAlt->getLocale() ) );
612cdf0e10cSrcweir 				}
613cdf0e10cSrcweir 				else
614cdf0e10cSrcweir 					bSpell = sal_False;
615cdf0e10cSrcweir 			}
616cdf0e10cSrcweir 		}
617cdf0e10cSrcweir 		else if (xHyphWord.is())
618cdf0e10cSrcweir 			bSpell = sal_False;
619cdf0e10cSrcweir 		else
620cdf0e10cSrcweir 		{
621cdf0e10cSrcweir 			SpellEnd();
622cdf0e10cSrcweir 			bSpell = SpellNext();
623cdf0e10cSrcweir 		}
624cdf0e10cSrcweir 	}
625cdf0e10cSrcweir 	WAIT_OFF();
626cdf0e10cSrcweir 	return GetLast().is();
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 
631