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