1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file
5efeef26fSAndrew Rist * distributed with this work for additional information
6efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at
10efeef26fSAndrew Rist *
11efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist *
13efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist * software distributed under the License is distributed on an
15efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist * KIND, either express or implied. See the License for the
17efeef26fSAndrew Rist * specific language governing permissions and limitations
18efeef26fSAndrew Rist * under the License.
19efeef26fSAndrew Rist *
20efeef26fSAndrew Rist *************************************************************/
21efeef26fSAndrew Rist
22efeef26fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <com/sun/star/linguistic2/ProofreadingResult.hpp>
28cdf0e10cSrcweir #include <com/sun/star/linguistic2/XProofreader.hpp>
29cdf0e10cSrcweir #include <com/sun/star/linguistic2/XProofreadingIterator.hpp>
30cdf0e10cSrcweir #include <com/sun/star/text/XFlatParagraph.hpp>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <unoflatpara.hxx>
33cdf0e10cSrcweir
34cdf0e10cSrcweir #include <comcore.hrc>
35cdf0e10cSrcweir #include <hintids.hxx>
36cdf0e10cSrcweir #include <linguistic/lngprops.hxx>
37cdf0e10cSrcweir #include <vcl/msgbox.hxx>
38cdf0e10cSrcweir #include <editeng/unolingu.hxx>
39cdf0e10cSrcweir #include <editeng/svxacorr.hxx>
40cdf0e10cSrcweir #include <editeng/langitem.hxx>
41cdf0e10cSrcweir #include <editeng/SpellPortions.hxx>
42cdf0e10cSrcweir #include <editeng/scripttypeitem.hxx>
43cdf0e10cSrcweir #include <charatr.hxx>
44cdf0e10cSrcweir #include <editsh.hxx>
45cdf0e10cSrcweir #include <doc.hxx>
46cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
47cdf0e10cSrcweir #include <rootfrm.hxx> // SwRootFrm
48cdf0e10cSrcweir #include <pam.hxx>
49cdf0e10cSrcweir #include <swundo.hxx> // fuer die UndoIds
50cdf0e10cSrcweir #include <ndtxt.hxx> // AdjHyphPos
51cdf0e10cSrcweir #include <viewopt.hxx> // HyphStart/End
52cdf0e10cSrcweir #include <viscrs.hxx> // SwShellCrsr
53cdf0e10cSrcweir #include <SwGrammarMarkUp.hxx> // SwWrongList
54cdf0e10cSrcweir #include <mdiexp.hxx> // Statusanzeige
55cdf0e10cSrcweir #include <statstr.hrc> // StatLine-String
56cdf0e10cSrcweir #include <cntfrm.hxx>
57cdf0e10cSrcweir #include <crsskip.hxx>
58cdf0e10cSrcweir #include <splargs.hxx>
59cdf0e10cSrcweir #include <redline.hxx> // SwRedline
60cdf0e10cSrcweir #include <docary.hxx> // SwRedlineTbl
61cdf0e10cSrcweir #include <docsh.hxx>
62cdf0e10cSrcweir #include <txatbase.hxx>
63cdf0e10cSrcweir #include <txtfrm.hxx>
64cdf0e10cSrcweir
65cdf0e10cSrcweir using namespace ::svx;
66cdf0e10cSrcweir using namespace ::com::sun::star;
67cdf0e10cSrcweir using namespace ::com::sun::star::uno;
68cdf0e10cSrcweir using namespace ::com::sun::star::beans;
69cdf0e10cSrcweir using namespace ::com::sun::star::linguistic2;
70cdf0e10cSrcweir
71cdf0e10cSrcweir #define C2U(cChar) rtl::OUString::createFromAscii(cChar)
72cdf0e10cSrcweir
73cdf0e10cSrcweir /*************************************************************************
74cdf0e10cSrcweir * class SwLinguIter
75cdf0e10cSrcweir *************************************************************************/
76cdf0e10cSrcweir
77cdf0e10cSrcweir class SwLinguIter
78cdf0e10cSrcweir {
79cdf0e10cSrcweir SwEditShell *pSh;
80cdf0e10cSrcweir SwPosition *pStart;
81cdf0e10cSrcweir SwPosition *pEnd;
82cdf0e10cSrcweir SwPosition *pCurr;
83cdf0e10cSrcweir SwPosition *pCurrX;
84cdf0e10cSrcweir sal_uInt16 nCrsrCnt;
85cdf0e10cSrcweir public:
86cdf0e10cSrcweir SwLinguIter();
87cdf0e10cSrcweir
GetSh()88cdf0e10cSrcweir inline SwEditShell *GetSh() { return pSh; }
GetSh() const89cdf0e10cSrcweir inline const SwEditShell *GetSh() const { return pSh; }
90cdf0e10cSrcweir
GetEnd() const91cdf0e10cSrcweir inline const SwPosition *GetEnd() const { return pEnd; }
SetEnd(SwPosition * pNew)92cdf0e10cSrcweir inline void SetEnd( SwPosition* pNew ){ delete pEnd; pEnd = pNew; }
93cdf0e10cSrcweir
GetStart() const94cdf0e10cSrcweir inline const SwPosition *GetStart() const { return pStart; }
SetStart(SwPosition * pNew)95cdf0e10cSrcweir inline void SetStart( SwPosition* pNew ){ delete pStart; pStart = pNew; }
96cdf0e10cSrcweir
GetCurr() const97cdf0e10cSrcweir inline const SwPosition *GetCurr() const { return pCurr; }
SetCurr(SwPosition * pNew)98cdf0e10cSrcweir inline void SetCurr( SwPosition* pNew ){ delete pCurr; pCurr = pNew; }
99cdf0e10cSrcweir
GetCurrX() const100cdf0e10cSrcweir inline const SwPosition *GetCurrX() const { return pCurrX; }
SetCurrX(SwPosition * pNew)101cdf0e10cSrcweir inline void SetCurrX( SwPosition* pNew ){ delete pCurrX; pCurrX = pNew; }
102cdf0e10cSrcweir
GetCrsrCnt()103cdf0e10cSrcweir inline sal_uInt16& GetCrsrCnt(){ return nCrsrCnt; }
104cdf0e10cSrcweir
105cdf0e10cSrcweir // Der UI-Bauchladen:
106cdf0e10cSrcweir void _Start( SwEditShell *pSh, SwDocPositions eStart,
107cdf0e10cSrcweir SwDocPositions eEnd );
108cdf0e10cSrcweir void _End(bool bRestoreSelection = true);
109cdf0e10cSrcweir };
110cdf0e10cSrcweir
111cdf0e10cSrcweir /*************************************************************************
112cdf0e10cSrcweir * class SwSpellIter
113cdf0e10cSrcweir *************************************************************************/
114cdf0e10cSrcweir
115cdf0e10cSrcweir // #i18881# to be able to identify the postions of the changed words
116cdf0e10cSrcweir // the content positions of each portion need to be saved
117cdf0e10cSrcweir struct SpellContentPosition
118cdf0e10cSrcweir {
119cdf0e10cSrcweir sal_uInt16 nLeft;
120cdf0e10cSrcweir sal_uInt16 nRight;
121cdf0e10cSrcweir };
122cdf0e10cSrcweir typedef std::vector<SpellContentPosition> SpellContentPositions;
123cdf0e10cSrcweir class SwSpellIter : public SwLinguIter
124cdf0e10cSrcweir {
125cdf0e10cSrcweir uno::Reference< XSpellChecker1 > xSpeller;
126cdf0e10cSrcweir ::svx::SpellPortions aLastPortions;
127cdf0e10cSrcweir
128cdf0e10cSrcweir SpellContentPositions aLastPositions;
129cdf0e10cSrcweir bool bBackToStartOfSentence;
130cdf0e10cSrcweir bool bMoveToEndOfSentence;
131cdf0e10cSrcweir
132cdf0e10cSrcweir
133cdf0e10cSrcweir void CreatePortion(uno::Reference< XSpellAlternatives > xAlt,
134cdf0e10cSrcweir linguistic2::ProofreadingResult* pGrammarResult,
135cdf0e10cSrcweir bool bIsField, bool bIsHidden);
136cdf0e10cSrcweir
137cdf0e10cSrcweir void AddPortion(uno::Reference< XSpellAlternatives > xAlt,
138cdf0e10cSrcweir linguistic2::ProofreadingResult* pGrammarResult,
139cdf0e10cSrcweir const SpellContentPositions& rDeletedRedlines);
140cdf0e10cSrcweir public:
SwSpellIter()141cdf0e10cSrcweir SwSpellIter() :
142cdf0e10cSrcweir bBackToStartOfSentence(false), bMoveToEndOfSentence(false) {}
143cdf0e10cSrcweir
144cdf0e10cSrcweir void Start( SwEditShell *pSh, SwDocPositions eStart, SwDocPositions eEnd );
145cdf0e10cSrcweir
146cdf0e10cSrcweir uno::Any Continue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt );
147cdf0e10cSrcweir
148cdf0e10cSrcweir bool SpellSentence(::svx::SpellPortions& rPortions, bool bIsGrammarCheck);
149cdf0e10cSrcweir void ToSentenceStart();
GetLastPortions()150cdf0e10cSrcweir const ::svx::SpellPortions GetLastPortions(){ return aLastPortions;}
GetLastPositions()151cdf0e10cSrcweir SpellContentPositions GetLastPositions() {return aLastPositions;}
ContinueAfterThisSentence()152cdf0e10cSrcweir void ContinueAfterThisSentence() { bMoveToEndOfSentence = true; }
153cdf0e10cSrcweir };
154cdf0e10cSrcweir
155cdf0e10cSrcweir /*************************************************************************
156cdf0e10cSrcweir * class SwConvIter
157cdf0e10cSrcweir * used for text conversion
158cdf0e10cSrcweir *************************************************************************/
159cdf0e10cSrcweir
160cdf0e10cSrcweir class SwConvIter : public SwLinguIter
161cdf0e10cSrcweir {
162cdf0e10cSrcweir SwConversionArgs &rArgs;
163cdf0e10cSrcweir public:
SwConvIter(SwConversionArgs & rConvArgs)164cdf0e10cSrcweir SwConvIter( SwConversionArgs &rConvArgs ) :
165cdf0e10cSrcweir rArgs( rConvArgs )
166cdf0e10cSrcweir {}
167cdf0e10cSrcweir
168cdf0e10cSrcweir void Start( SwEditShell *pSh, SwDocPositions eStart, SwDocPositions eEnd );
169cdf0e10cSrcweir
170cdf0e10cSrcweir uno::Any Continue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt );
171cdf0e10cSrcweir };
172cdf0e10cSrcweir
173cdf0e10cSrcweir /*************************************************************************
174cdf0e10cSrcweir * class SwHyphIter
175cdf0e10cSrcweir *************************************************************************/
176cdf0e10cSrcweir
177cdf0e10cSrcweir class SwHyphIter : public SwLinguIter
178cdf0e10cSrcweir {
179cdf0e10cSrcweir sal_Bool bOldIdle;
180cdf0e10cSrcweir void DelSoftHyph( SwPaM &rPam );
181cdf0e10cSrcweir
182cdf0e10cSrcweir public:
SwHyphIter()183cdf0e10cSrcweir SwHyphIter() : bOldIdle(sal_False) {}
184cdf0e10cSrcweir
185cdf0e10cSrcweir void Start( SwEditShell *pSh, SwDocPositions eStart, SwDocPositions eEnd );
186cdf0e10cSrcweir void End();
187cdf0e10cSrcweir
188cdf0e10cSrcweir void Ignore();
189cdf0e10cSrcweir
190cdf0e10cSrcweir uno::Any Continue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt );
191cdf0e10cSrcweir
192cdf0e10cSrcweir sal_Bool IsAuto();
193cdf0e10cSrcweir void InsertSoftHyph( const xub_StrLen nHyphPos );
194cdf0e10cSrcweir void ShowSelection();
195cdf0e10cSrcweir };
196cdf0e10cSrcweir
197cdf0e10cSrcweir static SwSpellIter* pSpellIter = 0;
198cdf0e10cSrcweir static SwConvIter* pConvIter = 0;
199cdf0e10cSrcweir static SwHyphIter* pHyphIter = 0;
200cdf0e10cSrcweir
201cdf0e10cSrcweir // Wir ersparen uns in Hyphenate ein GetFrm()
202cdf0e10cSrcweir // Achtung: in txtedt.cxx stehen extern-Deklarationen auf diese Pointer!
203cdf0e10cSrcweir const SwTxtNode *pLinguNode;
204cdf0e10cSrcweir SwTxtFrm *pLinguFrm;
205cdf0e10cSrcweir
206cdf0e10cSrcweir /*************************************************************************
207cdf0e10cSrcweir * SwLinguIter::SwLinguIter
208cdf0e10cSrcweir *************************************************************************/
209cdf0e10cSrcweir
SwLinguIter()210cdf0e10cSrcweir SwLinguIter::SwLinguIter()
211cdf0e10cSrcweir : pSh( 0 ), pStart( 0 ), pEnd( 0 ), pCurr( 0 ), pCurrX( 0 )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir // @@@ es fehlt: Sicherstellen der Reentrance, ASSERTs etc.
214cdf0e10cSrcweir }
215cdf0e10cSrcweir
216cdf0e10cSrcweir /*************************************************************************
217cdf0e10cSrcweir * SwLinguIter::Start
218cdf0e10cSrcweir *************************************************************************/
219cdf0e10cSrcweir
220cdf0e10cSrcweir
221cdf0e10cSrcweir
_Start(SwEditShell * pShell,SwDocPositions eStart,SwDocPositions eEnd)222cdf0e10cSrcweir void SwLinguIter::_Start( SwEditShell *pShell, SwDocPositions eStart,
223cdf0e10cSrcweir SwDocPositions eEnd )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir // es fehlt: Sicherstellen der Reentrance, Locking
226cdf0e10cSrcweir if( pSh )
227cdf0e10cSrcweir return;
228cdf0e10cSrcweir
229cdf0e10cSrcweir sal_Bool bSetCurr;
230cdf0e10cSrcweir
231cdf0e10cSrcweir pSh = pShell;
232cdf0e10cSrcweir
233cdf0e10cSrcweir SET_CURR_SHELL( pSh );
234cdf0e10cSrcweir
235cdf0e10cSrcweir ASSERT( !pEnd, "LinguStart ohne End?");
236cdf0e10cSrcweir
237cdf0e10cSrcweir SwPaM *pCrsr = pSh->GetCrsr();
238cdf0e10cSrcweir
239cdf0e10cSrcweir // pStk->SetCurCrsr();
240cdf0e10cSrcweir // if( pCrsr->HasMark() || pCrsr != pCrsr->GetNext() )
241cdf0e10cSrcweir if( pShell->HasSelection() || pCrsr != pCrsr->GetNext() )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir bSetCurr = 0 != GetCurr();
244cdf0e10cSrcweir nCrsrCnt = pSh->GetCrsrCnt();
245cdf0e10cSrcweir if( pSh->IsTableMode() )
246cdf0e10cSrcweir pSh->TblCrsrToCursor();
247cdf0e10cSrcweir
248cdf0e10cSrcweir pSh->Push();
249cdf0e10cSrcweir sal_uInt16 n;
250cdf0e10cSrcweir for( n = 0; n < nCrsrCnt; ++n )
251cdf0e10cSrcweir {
252cdf0e10cSrcweir pSh->Push();
253cdf0e10cSrcweir pSh->DestroyCrsr();
254cdf0e10cSrcweir }
255cdf0e10cSrcweir pSh->Pop( sal_False );
256cdf0e10cSrcweir }
257cdf0e10cSrcweir else
258cdf0e10cSrcweir {
259cdf0e10cSrcweir bSetCurr = sal_False;
260cdf0e10cSrcweir nCrsrCnt = 1;
261cdf0e10cSrcweir pSh->Push();
262cdf0e10cSrcweir pSh->SetLinguRange( eStart, eEnd );
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir pCrsr = pSh->GetCrsr();
266cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
267cdf0e10cSrcweir pCrsr->Exchange();
268cdf0e10cSrcweir
269cdf0e10cSrcweir pStart = new SwPosition( *pCrsr->GetPoint() );
270cdf0e10cSrcweir pEnd = new SwPosition( *pCrsr->GetMark() );
271cdf0e10cSrcweir if( bSetCurr )
272cdf0e10cSrcweir {
273cdf0e10cSrcweir SwPosition* pNew = new SwPosition( *GetStart() );
274cdf0e10cSrcweir SetCurr( pNew );
275cdf0e10cSrcweir pNew = new SwPosition( *pNew );
276cdf0e10cSrcweir SetCurrX( pNew );
277cdf0e10cSrcweir }
278cdf0e10cSrcweir
279cdf0e10cSrcweir pCrsr->SetMark();
280cdf0e10cSrcweir
281cdf0e10cSrcweir pLinguFrm = 0;
282cdf0e10cSrcweir pLinguNode = 0;
283cdf0e10cSrcweir }
284cdf0e10cSrcweir
285cdf0e10cSrcweir /*************************************************************************
286cdf0e10cSrcweir * SwLinguIter::End
287cdf0e10cSrcweir *************************************************************************/
288cdf0e10cSrcweir
289cdf0e10cSrcweir
290cdf0e10cSrcweir
_End(bool bRestoreSelection)291cdf0e10cSrcweir void SwLinguIter::_End(bool bRestoreSelection)
292cdf0e10cSrcweir {
293cdf0e10cSrcweir if( !pSh )
294cdf0e10cSrcweir return;
295cdf0e10cSrcweir
296cdf0e10cSrcweir ASSERT( pEnd, "SwEditShell::SpellEnd() ohne Start?");
297cdf0e10cSrcweir if(bRestoreSelection)
298cdf0e10cSrcweir {
299cdf0e10cSrcweir while( nCrsrCnt-- )
300cdf0e10cSrcweir pSh->Pop( sal_False );
301cdf0e10cSrcweir
302cdf0e10cSrcweir pSh->KillPams();
303cdf0e10cSrcweir pSh->ClearMark();
304cdf0e10cSrcweir }
305cdf0e10cSrcweir DELETEZ(pStart);
306cdf0e10cSrcweir DELETEZ(pEnd);
307cdf0e10cSrcweir DELETEZ(pCurr);
308cdf0e10cSrcweir DELETEZ(pCurrX);
309cdf0e10cSrcweir
310cdf0e10cSrcweir pSh = 0;
311cdf0e10cSrcweir
312cdf0e10cSrcweir #ifdef LINGU_STATISTIK
313cdf0e10cSrcweir aSwLinguStat.Flush();
314cdf0e10cSrcweir #endif
315cdf0e10cSrcweir }
316cdf0e10cSrcweir
317cdf0e10cSrcweir /*************************************************************************
318cdf0e10cSrcweir * virtual SwSpellIter::Start()
319cdf0e10cSrcweir *************************************************************************/
320cdf0e10cSrcweir
321cdf0e10cSrcweir
322cdf0e10cSrcweir
Start(SwEditShell * pShell,SwDocPositions eStart,SwDocPositions eEnd)323cdf0e10cSrcweir void SwSpellIter::Start( SwEditShell *pShell, SwDocPositions eStart,
324cdf0e10cSrcweir SwDocPositions eEnd )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir if( GetSh() )
327cdf0e10cSrcweir return;
328cdf0e10cSrcweir
329cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProp( ::GetLinguPropertySet() );
330cdf0e10cSrcweir xSpeller = ::GetSpellChecker();
331cdf0e10cSrcweir if ( xSpeller.is() )
332cdf0e10cSrcweir _Start( pShell, eStart, eEnd );
333cdf0e10cSrcweir aLastPortions.clear();
334cdf0e10cSrcweir aLastPositions.clear();
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
337cdf0e10cSrcweir /*************************************************************************
338cdf0e10cSrcweir * SwSpellIter::Continue
339cdf0e10cSrcweir *************************************************************************/
340cdf0e10cSrcweir
341cdf0e10cSrcweir // SwSpellIter::Continue ist das alte Original von
342cdf0e10cSrcweir // SwEditShell::SpellContinue()
343cdf0e10cSrcweir
Continue(sal_uInt16 * pPageCnt,sal_uInt16 * pPageSt)344cdf0e10cSrcweir uno::Any SwSpellIter::Continue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt )
345cdf0e10cSrcweir {
346cdf0e10cSrcweir //!!
347cdf0e10cSrcweir //!! Please check SwConvIter also when modifying this
348cdf0e10cSrcweir //!!
349cdf0e10cSrcweir
350cdf0e10cSrcweir uno::Any aSpellRet;
351cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
352cdf0e10cSrcweir if( !pMySh )
353cdf0e10cSrcweir return aSpellRet;
354cdf0e10cSrcweir
355cdf0e10cSrcweir // const SwPosition *pEnd = GetEnd();
356cdf0e10cSrcweir
357cdf0e10cSrcweir ASSERT( GetEnd(), "SwEditShell::SpellContinue() ohne Start?");
358cdf0e10cSrcweir
359cdf0e10cSrcweir uno::Reference< uno::XInterface > xSpellRet;
360cdf0e10cSrcweir sal_Bool bGoOn = sal_True;
361cdf0e10cSrcweir do {
362cdf0e10cSrcweir SwPaM *pCrsr = pMySh->GetCrsr();
363cdf0e10cSrcweir if ( !pCrsr->HasMark() )
364cdf0e10cSrcweir pCrsr->SetMark();
365cdf0e10cSrcweir
366cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProp( GetLinguPropertySet() );
367cdf0e10cSrcweir *pMySh->GetCrsr()->GetPoint() = *GetCurr();
368cdf0e10cSrcweir *pMySh->GetCrsr()->GetMark() = *GetEnd();
369cdf0e10cSrcweir pMySh->GetDoc()->Spell(*pMySh->GetCrsr(),
370cdf0e10cSrcweir xSpeller, pPageCnt, pPageSt, false ) >>= xSpellRet;
371cdf0e10cSrcweir bGoOn = GetCrsrCnt() > 1;
372cdf0e10cSrcweir if( xSpellRet.is() )
373cdf0e10cSrcweir {
374cdf0e10cSrcweir bGoOn = sal_False;
375cdf0e10cSrcweir SwPosition* pNewPoint = new SwPosition( *pCrsr->GetPoint() );
376cdf0e10cSrcweir SwPosition* pNewMark = new SwPosition( *pCrsr->GetMark() );
377cdf0e10cSrcweir SetCurr( pNewPoint );
378cdf0e10cSrcweir SetCurrX( pNewMark );
379cdf0e10cSrcweir }
380cdf0e10cSrcweir if( bGoOn )
381cdf0e10cSrcweir {
382cdf0e10cSrcweir pMySh->Pop( sal_False );
383cdf0e10cSrcweir pCrsr = pMySh->GetCrsr();
384cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
385cdf0e10cSrcweir pCrsr->Exchange();
386cdf0e10cSrcweir SwPosition* pNew = new SwPosition( *pCrsr->GetPoint() );
387cdf0e10cSrcweir SetStart( pNew );
388cdf0e10cSrcweir pNew = new SwPosition( *pCrsr->GetMark() );
389cdf0e10cSrcweir SetEnd( pNew );
390cdf0e10cSrcweir pNew = new SwPosition( *GetStart() );
391cdf0e10cSrcweir SetCurr( pNew );
392cdf0e10cSrcweir pNew = new SwPosition( *pNew );
393cdf0e10cSrcweir SetCurrX( pNew );
394cdf0e10cSrcweir pCrsr->SetMark();
395cdf0e10cSrcweir --GetCrsrCnt();
396cdf0e10cSrcweir }
397cdf0e10cSrcweir }while ( bGoOn );
398cdf0e10cSrcweir aSpellRet <<= xSpellRet;
399cdf0e10cSrcweir return aSpellRet;
400cdf0e10cSrcweir }
401cdf0e10cSrcweir
402cdf0e10cSrcweir /*************************************************************************
403cdf0e10cSrcweir * virtual SwConvIter::Start()
404cdf0e10cSrcweir *************************************************************************/
405cdf0e10cSrcweir
406cdf0e10cSrcweir
407cdf0e10cSrcweir
Start(SwEditShell * pShell,SwDocPositions eStart,SwDocPositions eEnd)408cdf0e10cSrcweir void SwConvIter::Start( SwEditShell *pShell, SwDocPositions eStart,
409cdf0e10cSrcweir SwDocPositions eEnd )
410cdf0e10cSrcweir {
411cdf0e10cSrcweir if( GetSh() )
412cdf0e10cSrcweir return;
413cdf0e10cSrcweir _Start( pShell, eStart, eEnd );
414cdf0e10cSrcweir }
415cdf0e10cSrcweir
416cdf0e10cSrcweir /*************************************************************************
417cdf0e10cSrcweir * SwConvIter::Continue
418cdf0e10cSrcweir *************************************************************************/
419cdf0e10cSrcweir
Continue(sal_uInt16 * pPageCnt,sal_uInt16 * pPageSt)420cdf0e10cSrcweir uno::Any SwConvIter::Continue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt )
421cdf0e10cSrcweir {
422cdf0e10cSrcweir //!!
423cdf0e10cSrcweir //!! Please check SwSpellIter also when modifying this
424cdf0e10cSrcweir //!!
425cdf0e10cSrcweir
426cdf0e10cSrcweir uno::Any aConvRet( makeAny( rtl::OUString() ) );
427cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
428cdf0e10cSrcweir if( !pMySh )
429cdf0e10cSrcweir return aConvRet;
430cdf0e10cSrcweir
431cdf0e10cSrcweir // const SwPosition *pEnd = GetEnd();
432cdf0e10cSrcweir
433cdf0e10cSrcweir ASSERT( GetEnd(), "SwConvIter::Continue() ohne Start?");
434cdf0e10cSrcweir
435cdf0e10cSrcweir rtl::OUString aConvText;
436cdf0e10cSrcweir sal_Bool bGoOn = sal_True;
437cdf0e10cSrcweir do {
438cdf0e10cSrcweir SwPaM *pCrsr = pMySh->GetCrsr();
439cdf0e10cSrcweir if ( !pCrsr->HasMark() )
440cdf0e10cSrcweir pCrsr->SetMark();
441cdf0e10cSrcweir
442cdf0e10cSrcweir *pMySh->GetCrsr()->GetPoint() = *GetCurr();
443cdf0e10cSrcweir *pMySh->GetCrsr()->GetMark() = *GetEnd();
444cdf0e10cSrcweir
445cdf0e10cSrcweir // call function to find next text portion to be converted
446cdf0e10cSrcweir uno::Reference< linguistic2::XSpellChecker1 > xEmpty;
447cdf0e10cSrcweir pMySh->GetDoc()->Spell( *pMySh->GetCrsr(),
448cdf0e10cSrcweir xEmpty, pPageCnt, pPageSt, false, &rArgs ) >>= aConvText;
449cdf0e10cSrcweir
450cdf0e10cSrcweir bGoOn = GetCrsrCnt() > 1;
451cdf0e10cSrcweir if( aConvText.getLength() )
452cdf0e10cSrcweir {
453cdf0e10cSrcweir bGoOn = sal_False;
454cdf0e10cSrcweir SwPosition* pNewPoint = new SwPosition( *pCrsr->GetPoint() );
455cdf0e10cSrcweir SwPosition* pNewMark = new SwPosition( *pCrsr->GetMark() );
456cdf0e10cSrcweir
457cdf0e10cSrcweir SetCurr( pNewPoint );
458cdf0e10cSrcweir SetCurrX( pNewMark );
459cdf0e10cSrcweir }
460cdf0e10cSrcweir if( bGoOn )
461cdf0e10cSrcweir {
462cdf0e10cSrcweir pMySh->Pop( sal_False );
463cdf0e10cSrcweir pCrsr = pMySh->GetCrsr();
464cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
465cdf0e10cSrcweir pCrsr->Exchange();
466cdf0e10cSrcweir SwPosition* pNew = new SwPosition( *pCrsr->GetPoint() );
467cdf0e10cSrcweir SetStart( pNew );
468cdf0e10cSrcweir pNew = new SwPosition( *pCrsr->GetMark() );
469cdf0e10cSrcweir SetEnd( pNew );
470cdf0e10cSrcweir pNew = new SwPosition( *GetStart() );
471cdf0e10cSrcweir SetCurr( pNew );
472cdf0e10cSrcweir pNew = new SwPosition( *pNew );
473cdf0e10cSrcweir SetCurrX( pNew );
474cdf0e10cSrcweir pCrsr->SetMark();
475cdf0e10cSrcweir --GetCrsrCnt();
476cdf0e10cSrcweir }
477cdf0e10cSrcweir }while ( bGoOn );
478cdf0e10cSrcweir return makeAny( aConvText );
479cdf0e10cSrcweir }
480cdf0e10cSrcweir
481cdf0e10cSrcweir
482cdf0e10cSrcweir /*************************************************************************
483cdf0e10cSrcweir * SwHyphIter
484cdf0e10cSrcweir *************************************************************************/
485cdf0e10cSrcweir
486cdf0e10cSrcweir
IsAuto()487cdf0e10cSrcweir sal_Bool SwHyphIter::IsAuto()
488cdf0e10cSrcweir {
489cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProp( ::GetLinguPropertySet() );
490cdf0e10cSrcweir return xProp.is() ? *(sal_Bool*)xProp->getPropertyValue(
491cdf0e10cSrcweir C2U(UPN_IS_HYPH_AUTO) ).getValue()
492cdf0e10cSrcweir : sal_False;
493cdf0e10cSrcweir }
494cdf0e10cSrcweir
495cdf0e10cSrcweir
ShowSelection()496cdf0e10cSrcweir void SwHyphIter::ShowSelection()
497cdf0e10cSrcweir {
498cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
499cdf0e10cSrcweir if( pMySh )
500cdf0e10cSrcweir {
501cdf0e10cSrcweir pMySh->StartAction();
502cdf0e10cSrcweir // Ganz fatal: durch das EndAction() werden Formatierungen
503cdf0e10cSrcweir // angeregt, die dazu fuehren koennen, dass im Hyphenator
504cdf0e10cSrcweir // neue Worte eingestellt werden. Deswegen sichern!
505cdf0e10cSrcweir pMySh->EndAction();
506cdf0e10cSrcweir }
507cdf0e10cSrcweir }
508cdf0e10cSrcweir
509cdf0e10cSrcweir /*************************************************************************
510cdf0e10cSrcweir * virtual SwHyphIter::Start()
511cdf0e10cSrcweir *************************************************************************/
512cdf0e10cSrcweir
513cdf0e10cSrcweir
514cdf0e10cSrcweir
Start(SwEditShell * pShell,SwDocPositions eStart,SwDocPositions eEnd)515cdf0e10cSrcweir void SwHyphIter::Start( SwEditShell *pShell, SwDocPositions eStart, SwDocPositions eEnd )
516cdf0e10cSrcweir {
517cdf0e10cSrcweir // robust
518cdf0e10cSrcweir if( GetSh() || GetEnd() )
519cdf0e10cSrcweir {
520cdf0e10cSrcweir ASSERT( !GetSh(), "+SwEditShell::HyphStart: missing HyphEnd()" );
521cdf0e10cSrcweir return;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir
524cdf0e10cSrcweir // nothing to be done (at least not in the way as in the "else" part)
525cdf0e10cSrcweir bOldIdle = pShell->GetViewOptions()->IsIdle();
526cdf0e10cSrcweir ((SwViewOption*)pShell->GetViewOptions())->SetIdle( sal_False );
527cdf0e10cSrcweir _Start( pShell, eStart, eEnd );
528cdf0e10cSrcweir }
529cdf0e10cSrcweir
530cdf0e10cSrcweir /*************************************************************************
531cdf0e10cSrcweir * virtual SwHyphIter::End
532cdf0e10cSrcweir *************************************************************************/
533cdf0e10cSrcweir
534cdf0e10cSrcweir // Selektionen wiederherstellen
535cdf0e10cSrcweir
536cdf0e10cSrcweir
537cdf0e10cSrcweir
End()538cdf0e10cSrcweir void SwHyphIter::End()
539cdf0e10cSrcweir {
540cdf0e10cSrcweir if( !GetSh() )
541cdf0e10cSrcweir return;
542cdf0e10cSrcweir ((SwViewOption*)GetSh()->GetViewOptions())->SetIdle( bOldIdle );
543cdf0e10cSrcweir _End();
544cdf0e10cSrcweir }
545cdf0e10cSrcweir
546cdf0e10cSrcweir /*************************************************************************
547cdf0e10cSrcweir * SwHyphIter::Continue
548cdf0e10cSrcweir *************************************************************************/
549cdf0e10cSrcweir
Continue(sal_uInt16 * pPageCnt,sal_uInt16 * pPageSt)550cdf0e10cSrcweir uno::Any SwHyphIter::Continue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt )
551cdf0e10cSrcweir {
552cdf0e10cSrcweir uno::Any aHyphRet;
553cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
554cdf0e10cSrcweir if( !pMySh )
555cdf0e10cSrcweir return aHyphRet;
556cdf0e10cSrcweir
557cdf0e10cSrcweir const sal_Bool bAuto = IsAuto();
558cdf0e10cSrcweir uno::Reference< XHyphenatedWord > xHyphWord;
559cdf0e10cSrcweir sal_uInt16 nRet;
560cdf0e10cSrcweir sal_Bool bGoOn = sal_False;
561cdf0e10cSrcweir do {
562cdf0e10cSrcweir SwPaM *pCrsr;
563cdf0e10cSrcweir do {
564cdf0e10cSrcweir ASSERT( GetEnd(), "SwEditShell::SpellContinue() ohne Start?" );
565cdf0e10cSrcweir pCrsr = pMySh->GetCrsr();
566cdf0e10cSrcweir if ( !pCrsr->HasMark() )
567cdf0e10cSrcweir pCrsr->SetMark();
568cdf0e10cSrcweir if ( *pCrsr->GetPoint() < *pCrsr->GetMark() )
569cdf0e10cSrcweir {
570cdf0e10cSrcweir pCrsr->Exchange();
571cdf0e10cSrcweir pCrsr->SetMark();
572cdf0e10cSrcweir }
573cdf0e10cSrcweir
574cdf0e10cSrcweir // geraten BUG:
575cdf0e10cSrcweir if ( *pCrsr->End() > *GetEnd() )
576cdf0e10cSrcweir nRet = 0;
577cdf0e10cSrcweir else
578cdf0e10cSrcweir {
579cdf0e10cSrcweir *pCrsr->GetMark() = *GetEnd();
580cdf0e10cSrcweir
581cdf0e10cSrcweir // Muss an der aktuellen Cursorpos das Wort getrennt werden ?
582cdf0e10cSrcweir const Point aCrsrPos( pMySh->GetCharRect().Pos() );
583cdf0e10cSrcweir xHyphWord = pMySh->GetDoc()->Hyphenate( pCrsr, aCrsrPos,
584cdf0e10cSrcweir pPageCnt, pPageSt );
585cdf0e10cSrcweir }
586cdf0e10cSrcweir
587cdf0e10cSrcweir if( bAuto && xHyphWord.is() )
588cdf0e10cSrcweir {
589cdf0e10cSrcweir pMySh->InsertSoftHyph( xHyphWord->getHyphenationPos() + 1);
590cdf0e10cSrcweir }
591cdf0e10cSrcweir } while( bAuto && xHyphWord.is() ); //end of do-while
592cdf0e10cSrcweir bGoOn = !xHyphWord.is() && GetCrsrCnt() > 1;
593cdf0e10cSrcweir
594cdf0e10cSrcweir if( bGoOn )
595cdf0e10cSrcweir {
596cdf0e10cSrcweir pMySh->Pop( sal_False );
597cdf0e10cSrcweir pCrsr = pMySh->GetCrsr();
598cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
599cdf0e10cSrcweir pCrsr->Exchange();
600cdf0e10cSrcweir SwPosition* pNew = new SwPosition(*pCrsr->End());
601cdf0e10cSrcweir SetEnd( pNew );
602cdf0e10cSrcweir pCrsr->SetMark();
603cdf0e10cSrcweir --GetCrsrCnt();
604cdf0e10cSrcweir }
605cdf0e10cSrcweir } while ( bGoOn );
606cdf0e10cSrcweir aHyphRet <<= xHyphWord;
607cdf0e10cSrcweir return aHyphRet;
608cdf0e10cSrcweir }
609cdf0e10cSrcweir
610cdf0e10cSrcweir /*************************************************************************
611cdf0e10cSrcweir * SwHyphIter::HyphIgnore
612cdf0e10cSrcweir *************************************************************************/
613cdf0e10cSrcweir
614cdf0e10cSrcweir // Beschreibung: Trennstelle ignorieren
615cdf0e10cSrcweir
Ignore()616cdf0e10cSrcweir void SwHyphIter::Ignore()
617cdf0e10cSrcweir {
618cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
619cdf0e10cSrcweir SwPaM *pCrsr = pMySh->GetCrsr();
620cdf0e10cSrcweir
621cdf0e10cSrcweir // Alten SoftHyphen loeschen
622cdf0e10cSrcweir DelSoftHyph( *pCrsr );
623cdf0e10cSrcweir
624cdf0e10cSrcweir // und weiter
625cdf0e10cSrcweir pCrsr->Start()->nContent = pCrsr->End()->nContent;
626cdf0e10cSrcweir pCrsr->SetMark();
627cdf0e10cSrcweir }
628cdf0e10cSrcweir
629cdf0e10cSrcweir /*************************************************************************
630cdf0e10cSrcweir * SwHyphIter::DelSoftHyph
631cdf0e10cSrcweir *************************************************************************/
632cdf0e10cSrcweir
DelSoftHyph(SwPaM & rPam)633cdf0e10cSrcweir void SwHyphIter::DelSoftHyph( SwPaM &rPam )
634cdf0e10cSrcweir {
635cdf0e10cSrcweir const SwPosition* pStt = rPam.Start();
636cdf0e10cSrcweir const xub_StrLen nStart = pStt->nContent.GetIndex();
637cdf0e10cSrcweir const xub_StrLen nEnd = rPam.End()->nContent.GetIndex();
638cdf0e10cSrcweir SwTxtNode *pNode = pStt->nNode.GetNode().GetTxtNode();
639cdf0e10cSrcweir pNode->DelSoftHyph( nStart, nEnd );
640cdf0e10cSrcweir }
641cdf0e10cSrcweir
642cdf0e10cSrcweir /*************************************************************************
643cdf0e10cSrcweir * SwHyphIter::InsertSoftHyph
644cdf0e10cSrcweir *************************************************************************/
645cdf0e10cSrcweir
646cdf0e10cSrcweir
InsertSoftHyph(const xub_StrLen nHyphPos)647cdf0e10cSrcweir void SwHyphIter::InsertSoftHyph( const xub_StrLen nHyphPos )
648cdf0e10cSrcweir {
649cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
650cdf0e10cSrcweir ASSERT( pMySh, "+SwEditShell::InsertSoftHyph: missing HyphStart()");
651cdf0e10cSrcweir if( !pMySh )
652cdf0e10cSrcweir return;
653cdf0e10cSrcweir
654cdf0e10cSrcweir SwPaM *pCrsr = pMySh->GetCrsr();
655cdf0e10cSrcweir SwPosition* pSttPos = pCrsr->Start();
656cdf0e10cSrcweir SwPosition* pEndPos = pCrsr->End();
657cdf0e10cSrcweir
658cdf0e10cSrcweir xub_StrLen nLastHyphLen = GetEnd()->nContent.GetIndex() -
659cdf0e10cSrcweir pSttPos->nContent.GetIndex();
660cdf0e10cSrcweir
661cdf0e10cSrcweir if( pSttPos->nNode != pEndPos->nNode || !nLastHyphLen )
662cdf0e10cSrcweir {
663cdf0e10cSrcweir ASSERT( pSttPos->nNode == pEndPos->nNode,
664cdf0e10cSrcweir "+SwEditShell::InsertSoftHyph: node warp during hyphenation" );
665cdf0e10cSrcweir ASSERT(nLastHyphLen, "+SwEditShell::InsertSoftHyph: missing HyphContinue()");
666cdf0e10cSrcweir *pSttPos = *pEndPos;
667cdf0e10cSrcweir return;
668cdf0e10cSrcweir }
669cdf0e10cSrcweir
670cdf0e10cSrcweir pMySh->StartAction();
671cdf0e10cSrcweir {
672cdf0e10cSrcweir SwDoc *pDoc = pMySh->GetDoc();
673cdf0e10cSrcweir DelSoftHyph( *pCrsr );
674cdf0e10cSrcweir pSttPos->nContent += nHyphPos;
675cdf0e10cSrcweir SwPaM aRg( *pSttPos );
676cdf0e10cSrcweir pDoc->InsertString( aRg, CHAR_SOFTHYPHEN );
677cdf0e10cSrcweir // Durch das Einfuegen des SoftHyphs ist ein Zeichen hinzugekommen
678cdf0e10cSrcweir //JP 18.07.95: warum, ist doch ein SwIndex, dieser wird doch mitverschoben !!
679cdf0e10cSrcweir // pSttPos->nContent++;
680cdf0e10cSrcweir }
681cdf0e10cSrcweir // Die Selektion wird wieder aufgehoben
682cdf0e10cSrcweir pCrsr->DeleteMark();
683cdf0e10cSrcweir pMySh->EndAction();
684cdf0e10cSrcweir pCrsr->SetMark();
685cdf0e10cSrcweir }
686cdf0e10cSrcweir
687cdf0e10cSrcweir // --------------------- Methoden der SwEditShell ------------------------
688cdf0e10cSrcweir
HasLastSentenceGotGrammarChecked() const689cdf0e10cSrcweir bool SwEditShell::HasLastSentenceGotGrammarChecked() const
690cdf0e10cSrcweir {
691cdf0e10cSrcweir bool bTextWasGrammarChecked = false;
692cdf0e10cSrcweir if (pSpellIter)
693cdf0e10cSrcweir {
694cdf0e10cSrcweir ::svx::SpellPortions aLastPortions( pSpellIter->GetLastPortions() );
695cdf0e10cSrcweir for (size_t i = 0; i < aLastPortions.size() && !bTextWasGrammarChecked; ++i)
696cdf0e10cSrcweir {
697cdf0e10cSrcweir // bIsGrammarError is also true if the text was only checked but no
698cdf0e10cSrcweir // grammar error was found. (That is if a ProofreadingResult was obtained in
699cdf0e10cSrcweir // SwDoc::Spell and in turn bIsGrammarError was set in SwSpellIter::CreatePortion)
700cdf0e10cSrcweir if (aLastPortions[i].bIsGrammarError)
701cdf0e10cSrcweir bTextWasGrammarChecked = true;
702cdf0e10cSrcweir }
703cdf0e10cSrcweir }
704cdf0e10cSrcweir return bTextWasGrammarChecked;
705cdf0e10cSrcweir }
706cdf0e10cSrcweir
707cdf0e10cSrcweir /*************************************************************************
708cdf0e10cSrcweir * SwEditShell::HasConvIter
709cdf0e10cSrcweir *************************************************************************/
710cdf0e10cSrcweir
HasConvIter() const711cdf0e10cSrcweir sal_Bool SwEditShell::HasConvIter() const
712cdf0e10cSrcweir {
713cdf0e10cSrcweir return 0 != pConvIter;
714cdf0e10cSrcweir }
715cdf0e10cSrcweir
716cdf0e10cSrcweir /*************************************************************************
717cdf0e10cSrcweir * SwEditShell::HasHyphIter
718cdf0e10cSrcweir *************************************************************************/
719cdf0e10cSrcweir
HasHyphIter() const720cdf0e10cSrcweir sal_Bool SwEditShell::HasHyphIter() const
721cdf0e10cSrcweir {
722cdf0e10cSrcweir return 0 != pHyphIter;
723cdf0e10cSrcweir }
724cdf0e10cSrcweir
725cdf0e10cSrcweir /*************************************************************************
726cdf0e10cSrcweir * SwEditShell::SetFindRange
727cdf0e10cSrcweir *************************************************************************/
728cdf0e10cSrcweir
SetLinguRange(SwDocPositions eStart,SwDocPositions eEnd)729cdf0e10cSrcweir void SwEditShell::SetLinguRange( SwDocPositions eStart, SwDocPositions eEnd )
730cdf0e10cSrcweir {
731cdf0e10cSrcweir SwPaM *pCrsr = GetCrsr();
732cdf0e10cSrcweir MakeFindRange( static_cast<sal_uInt16>(eStart), static_cast<sal_uInt16>(eEnd), pCrsr );
733cdf0e10cSrcweir if( *pCrsr->GetPoint() > *pCrsr->GetMark() )
734cdf0e10cSrcweir pCrsr->Exchange();
735cdf0e10cSrcweir }
736cdf0e10cSrcweir
737cdf0e10cSrcweir /*************************************************************************
738cdf0e10cSrcweir * SwEditShell::SpellStart
739cdf0e10cSrcweir *************************************************************************/
740cdf0e10cSrcweir
SpellStart(SwDocPositions eStart,SwDocPositions eEnd,SwDocPositions eCurr,SwConversionArgs * pConvArgs)741cdf0e10cSrcweir void SwEditShell::SpellStart(
742cdf0e10cSrcweir SwDocPositions eStart, SwDocPositions eEnd, SwDocPositions eCurr,
743cdf0e10cSrcweir SwConversionArgs *pConvArgs )
744cdf0e10cSrcweir {
745cdf0e10cSrcweir SwLinguIter *pLinguIter = 0;
746cdf0e10cSrcweir
747cdf0e10cSrcweir // do not spell if interactive spelling is active elsewhere
748cdf0e10cSrcweir if (!pConvArgs && !pSpellIter)
749cdf0e10cSrcweir {
750cdf0e10cSrcweir ASSERT( !pSpellIter, "wer ist da schon am spellen?" );
751cdf0e10cSrcweir pSpellIter = new SwSpellIter;
752cdf0e10cSrcweir pLinguIter = pSpellIter;
753cdf0e10cSrcweir }
754cdf0e10cSrcweir // do not do text conversion if it is active elsewhere
755cdf0e10cSrcweir if (pConvArgs && !pConvIter)
756cdf0e10cSrcweir {
757cdf0e10cSrcweir ASSERT( !pConvIter, "text conversion already active!" );
758cdf0e10cSrcweir pConvIter = new SwConvIter( *pConvArgs );
759cdf0e10cSrcweir pLinguIter = pConvIter;
760cdf0e10cSrcweir }
761cdf0e10cSrcweir
762cdf0e10cSrcweir if (pLinguIter)
763cdf0e10cSrcweir {
764cdf0e10cSrcweir SwCursor* pSwCrsr = GetSwCrsr();
765cdf0e10cSrcweir
766cdf0e10cSrcweir SwPosition *pTmp = new SwPosition( *pSwCrsr->GetPoint() );
767cdf0e10cSrcweir pSwCrsr->FillFindPos( eCurr, *pTmp );
768cdf0e10cSrcweir pLinguIter->SetCurr( pTmp );
769cdf0e10cSrcweir
770cdf0e10cSrcweir pTmp = new SwPosition( *pTmp );
771cdf0e10cSrcweir pLinguIter->SetCurrX( pTmp );
772cdf0e10cSrcweir }
773cdf0e10cSrcweir
774cdf0e10cSrcweir if (!pConvArgs && pSpellIter)
775cdf0e10cSrcweir pSpellIter->Start( this, eStart, eEnd );
776cdf0e10cSrcweir if (pConvArgs && pConvIter)
777cdf0e10cSrcweir pConvIter->Start( this, eStart, eEnd );
778cdf0e10cSrcweir }
779cdf0e10cSrcweir
780cdf0e10cSrcweir /*************************************************************************
781cdf0e10cSrcweir * SwEditShell::SpellEnd
782cdf0e10cSrcweir *************************************************************************/
783cdf0e10cSrcweir
SpellEnd(SwConversionArgs * pConvArgs,bool bRestoreSelection)784cdf0e10cSrcweir void SwEditShell::SpellEnd( SwConversionArgs *pConvArgs, bool bRestoreSelection )
785cdf0e10cSrcweir {
786cdf0e10cSrcweir if (!pConvArgs && pSpellIter && pSpellIter->GetSh() == this)
787cdf0e10cSrcweir {
788cdf0e10cSrcweir ASSERT( pSpellIter, "wo ist mein Iterator?" );
789cdf0e10cSrcweir pSpellIter->_End(bRestoreSelection);
790cdf0e10cSrcweir delete pSpellIter, pSpellIter = 0;
791cdf0e10cSrcweir }
792cdf0e10cSrcweir if (pConvArgs && pConvIter && pConvIter->GetSh() == this)
793cdf0e10cSrcweir {
794cdf0e10cSrcweir ASSERT( pConvIter, "wo ist mein Iterator?" );
795cdf0e10cSrcweir pConvIter->_End();
796cdf0e10cSrcweir delete pConvIter, pConvIter = 0;
797cdf0e10cSrcweir }
798cdf0e10cSrcweir }
799cdf0e10cSrcweir
800cdf0e10cSrcweir /*************************************************************************
801cdf0e10cSrcweir * SwEditShell::SpellContinue
802cdf0e10cSrcweir *************************************************************************/
803cdf0e10cSrcweir
804cdf0e10cSrcweir // liefert Rueckgabewerte entsprechend SPL_ in splchk.hxx
805cdf0e10cSrcweir
SpellContinue(sal_uInt16 * pPageCnt,sal_uInt16 * pPageSt,SwConversionArgs * pConvArgs)806cdf0e10cSrcweir uno::Any SwEditShell::SpellContinue(
807cdf0e10cSrcweir sal_uInt16* pPageCnt, sal_uInt16* pPageSt,
808cdf0e10cSrcweir SwConversionArgs *pConvArgs )
809cdf0e10cSrcweir {
810cdf0e10cSrcweir uno::Any aRes;
811cdf0e10cSrcweir
812cdf0e10cSrcweir if ((!pConvArgs && pSpellIter->GetSh() != this) ||
813cdf0e10cSrcweir ( pConvArgs && pConvIter->GetSh() != this))
814cdf0e10cSrcweir return aRes;
815cdf0e10cSrcweir
816cdf0e10cSrcweir if( pPageCnt && !*pPageCnt )
817cdf0e10cSrcweir {
818cdf0e10cSrcweir sal_uInt16 nEndPage = GetLayout()->GetPageNum();
819cdf0e10cSrcweir nEndPage += nEndPage * 10 / 100;
820cdf0e10cSrcweir *pPageCnt = nEndPage;
821cdf0e10cSrcweir if( nEndPage )
822cdf0e10cSrcweir ::StartProgress( STR_STATSTR_SPELL, 0, nEndPage, GetDoc()->GetDocShell() );
823cdf0e10cSrcweir }
824cdf0e10cSrcweir
825cdf0e10cSrcweir ASSERT( pConvArgs || pSpellIter, "SpellIter missing" );
826cdf0e10cSrcweir ASSERT( !pConvArgs || pConvIter, "ConvIter missing" );
827cdf0e10cSrcweir //JP 18.07.95: verhinder bei Fehlermeldungen die Anzeige der Selektionen
828cdf0e10cSrcweir // KEIN StartAction, da damit auch die Paints abgeschaltet
829cdf0e10cSrcweir // werden !!!!!
830cdf0e10cSrcweir ++nStartAction;
831cdf0e10cSrcweir rtl::OUString aRet;
832cdf0e10cSrcweir uno::Reference< uno::XInterface > xRet;
833cdf0e10cSrcweir if (pConvArgs)
834cdf0e10cSrcweir {
835cdf0e10cSrcweir pConvIter->Continue( pPageCnt, pPageSt ) >>= aRet;
836cdf0e10cSrcweir aRes <<= aRet;
837cdf0e10cSrcweir }
838cdf0e10cSrcweir else
839cdf0e10cSrcweir {
840cdf0e10cSrcweir pSpellIter->Continue( pPageCnt, pPageSt ) >>= xRet;
841cdf0e10cSrcweir aRes <<= xRet;
842cdf0e10cSrcweir }
843cdf0e10cSrcweir --nStartAction;
844cdf0e10cSrcweir
845cdf0e10cSrcweir if( aRet.getLength() || xRet.is() )
846cdf0e10cSrcweir {
847cdf0e10cSrcweir // dann die awt::Selection sichtbar machen
848cdf0e10cSrcweir StartAction();
849cdf0e10cSrcweir EndAction();
850cdf0e10cSrcweir }
851cdf0e10cSrcweir return aRes;
852cdf0e10cSrcweir }
853cdf0e10cSrcweir /*************************************************************************
854cdf0e10cSrcweir * SwEditShell::HyphStart
855cdf0e10cSrcweir *************************************************************************/
856cdf0e10cSrcweir
857cdf0e10cSrcweir /* Interaktive Trennung, BP 10.03.93
858cdf0e10cSrcweir *
859cdf0e10cSrcweir * 1) HyphStart
860cdf0e10cSrcweir * - Aufheben aller Selektionen
861cdf0e10cSrcweir * - Sichern des aktuellen Cursors
862cdf0e10cSrcweir * - falls keine Selektion vorhanden:
863cdf0e10cSrcweir * - neue Selektion bis zum Dokumentende
864cdf0e10cSrcweir * 2) HyphContinue
865cdf0e10cSrcweir * - nLastHyphLen wird auf den Selektionsstart addiert
866cdf0e10cSrcweir * - iteriert ueber alle selektierten Bereiche
867cdf0e10cSrcweir * - pDoc->Hyphenate() iteriert ueber alle Nodes der Selektion
868cdf0e10cSrcweir * - pTxtNode->Hyphenate() ruft das SwTxtFrm::Hyphenate zur EditShell
869cdf0e10cSrcweir * - SwTxtFrm:Hyphenate() iteriert ueber die Zeilen des Pams
870cdf0e10cSrcweir * - LineIter::Hyphenate() stellt den Hyphenator
871cdf0e10cSrcweir * und den Pam auf das zu trennende Wort ein.
872cdf0e10cSrcweir * - Es gibt nur zwei Returnwerte sal_True, wenn eine Trennstelle anliegt
873cdf0e10cSrcweir * und sal_False, wenn der Pam abgearbeitet wurde.
874cdf0e10cSrcweir * - Bei sal_True wird das selektierte Wort zur Anzeige gebracht und
875cdf0e10cSrcweir * nLastHyphLen gesetzt.
876cdf0e10cSrcweir * - Bei sal_False wird die aktuelle Selektion geloescht und die naechste
877cdf0e10cSrcweir * zur aktuellen gewaehlt. Return HYPH_OK, wenn keine mehr vorhanden.
878cdf0e10cSrcweir * 3) InsertSoftHyph (wird ggf. von der UI gerufen)
879cdf0e10cSrcweir * - Der aktuelle Cursor wird plaziert und das Attribut eingefuegt.
880cdf0e10cSrcweir * 4) HyphEnd
881cdf0e10cSrcweir * - Wiederherstellen des alten Cursors, EndAction
882cdf0e10cSrcweir */
883cdf0e10cSrcweir
884cdf0e10cSrcweir
885cdf0e10cSrcweir
HyphStart(SwDocPositions eStart,SwDocPositions eEnd)886cdf0e10cSrcweir void SwEditShell::HyphStart( SwDocPositions eStart, SwDocPositions eEnd )
887cdf0e10cSrcweir {
888cdf0e10cSrcweir // do not hyphenate if interactive hyphenationg is active elsewhere
889cdf0e10cSrcweir if (!pHyphIter)
890cdf0e10cSrcweir {
891cdf0e10cSrcweir ASSERT( !pHyphIter, "wer ist da schon am hyphinieren?" );
892cdf0e10cSrcweir pHyphIter = new SwHyphIter;
893cdf0e10cSrcweir pHyphIter->Start( this, eStart, eEnd );
894cdf0e10cSrcweir }
895cdf0e10cSrcweir }
896cdf0e10cSrcweir
897cdf0e10cSrcweir /*************************************************************************
898cdf0e10cSrcweir * SwEditShell::HyphEnd
899cdf0e10cSrcweir *************************************************************************/
900cdf0e10cSrcweir
901cdf0e10cSrcweir // Selektionen wiederherstellen
902cdf0e10cSrcweir
903cdf0e10cSrcweir
904cdf0e10cSrcweir
HyphEnd()905cdf0e10cSrcweir void SwEditShell::HyphEnd()
906cdf0e10cSrcweir {
907cdf0e10cSrcweir if (pHyphIter->GetSh() == this)
908cdf0e10cSrcweir {
909cdf0e10cSrcweir ASSERT( pHyphIter, "wo ist mein Iterator?" );
910cdf0e10cSrcweir pHyphIter->End();
911cdf0e10cSrcweir delete pHyphIter, pHyphIter = 0;
912cdf0e10cSrcweir }
913cdf0e10cSrcweir }
914cdf0e10cSrcweir
915cdf0e10cSrcweir /*************************************************************************
916cdf0e10cSrcweir * SwEditShell::HyphContinue
917cdf0e10cSrcweir *************************************************************************/
918cdf0e10cSrcweir
919cdf0e10cSrcweir // Returnwerte: (BP: ich wuerde es genau umdrehen, aber die UI wuenscht es so)
920cdf0e10cSrcweir // HYPH_CONTINUE, wenn eine Trennstelle anliegt
921cdf0e10cSrcweir // HYPH_OK, wenn der selektierte Bereich abgearbeitet wurde.
922cdf0e10cSrcweir
923cdf0e10cSrcweir
924cdf0e10cSrcweir uno::Reference< uno::XInterface >
HyphContinue(sal_uInt16 * pPageCnt,sal_uInt16 * pPageSt)925cdf0e10cSrcweir SwEditShell::HyphContinue( sal_uInt16* pPageCnt, sal_uInt16* pPageSt )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir if (pHyphIter->GetSh() != this)
928cdf0e10cSrcweir return 0;
929cdf0e10cSrcweir
930cdf0e10cSrcweir if( pPageCnt && !*pPageCnt && !*pPageSt )
931cdf0e10cSrcweir {
932cdf0e10cSrcweir sal_uInt16 nEndPage = GetLayout()->GetPageNum();
933cdf0e10cSrcweir nEndPage += nEndPage * 10 / 100;
934cdf0e10cSrcweir if( nEndPage > 14 )
935cdf0e10cSrcweir {
936cdf0e10cSrcweir *pPageCnt = nEndPage;
937cdf0e10cSrcweir ::StartProgress( STR_STATSTR_HYPHEN, 0, nEndPage, GetDoc()->GetDocShell());
938cdf0e10cSrcweir }
939cdf0e10cSrcweir else // Hiermit unterdruecken wir ein fuer allemal
940cdf0e10cSrcweir *pPageSt = 1; // das StatLineStartPercent
941cdf0e10cSrcweir }
942cdf0e10cSrcweir
943cdf0e10cSrcweir ASSERT( pHyphIter, "wo ist mein Iterator?" );
944cdf0e10cSrcweir //JP 18.07.95: verhinder bei Fehlermeldungen die Anzeige der Selektionen
945cdf0e10cSrcweir // KEIN StartAction, da damit auch die Paints abgeschaltet
946cdf0e10cSrcweir // werden !!!!!
947cdf0e10cSrcweir ++nStartAction;
948cdf0e10cSrcweir uno::Reference< uno::XInterface > xRet;
949cdf0e10cSrcweir pHyphIter->Continue( pPageCnt, pPageSt ) >>= xRet;
950cdf0e10cSrcweir --nStartAction;
951cdf0e10cSrcweir
952cdf0e10cSrcweir if( xRet.is() )
953cdf0e10cSrcweir pHyphIter->ShowSelection();
954cdf0e10cSrcweir
955cdf0e10cSrcweir return xRet;
956cdf0e10cSrcweir }
957cdf0e10cSrcweir
958cdf0e10cSrcweir
959cdf0e10cSrcweir /*************************************************************************
960cdf0e10cSrcweir * SwEditShell::InsertSoftHyph
961cdf0e10cSrcweir *************************************************************************/
962cdf0e10cSrcweir
963cdf0e10cSrcweir // Zum Einfuegen des SoftHyphens, Position ist der Offset
964cdf0e10cSrcweir // innerhalb des getrennten Wortes.
965cdf0e10cSrcweir
966cdf0e10cSrcweir
InsertSoftHyph(const xub_StrLen nHyphPos)967cdf0e10cSrcweir void SwEditShell::InsertSoftHyph( const xub_StrLen nHyphPos )
968cdf0e10cSrcweir {
969cdf0e10cSrcweir ASSERT( pHyphIter, "wo ist mein Iterator?" );
970cdf0e10cSrcweir pHyphIter->InsertSoftHyph( nHyphPos );
971cdf0e10cSrcweir }
972cdf0e10cSrcweir
973cdf0e10cSrcweir
974cdf0e10cSrcweir /*************************************************************************
975cdf0e10cSrcweir * SwEditShell::HyphIgnore
976cdf0e10cSrcweir *************************************************************************/
977cdf0e10cSrcweir
978cdf0e10cSrcweir // Beschreibung: Trennstelle ignorieren
979cdf0e10cSrcweir
HyphIgnore()980cdf0e10cSrcweir void SwEditShell::HyphIgnore()
981cdf0e10cSrcweir {
982cdf0e10cSrcweir ASSERT( pHyphIter, "wo ist mein Iterator?" );
983cdf0e10cSrcweir //JP 18.07.95: verhinder bei Fehlermeldungen die Anzeige der Selektionen
984cdf0e10cSrcweir // KEIN StartAction, da damit auch die Paints abgeschaltet
985cdf0e10cSrcweir // werden !!!!!
986cdf0e10cSrcweir ++nStartAction;
987cdf0e10cSrcweir pHyphIter->Ignore();
988cdf0e10cSrcweir --nStartAction;
989cdf0e10cSrcweir
990cdf0e10cSrcweir pHyphIter->ShowSelection();
991cdf0e10cSrcweir }
992cdf0e10cSrcweir
993cdf0e10cSrcweir /*************************************************************************
994cdf0e10cSrcweir * SwEditShell::GetCorrection()
995cdf0e10cSrcweir * liefert eine Liste von Vorschlaegen fuer falsch geschriebene Worte,
996cdf0e10cSrcweir * ein NULL-Pointer signalisiert, dass das Wort richtig geschrieben ist,
997cdf0e10cSrcweir * eine leere Liste, dass das Wort zwar unbekannt ist, aber keine Alternativen
998cdf0e10cSrcweir * geliefert werden koennen.
999cdf0e10cSrcweir *************************************************************************/
1000cdf0e10cSrcweir
1001cdf0e10cSrcweir
1002cdf0e10cSrcweir uno::Reference< XSpellAlternatives >
GetCorrection(const Point * pPt,SwRect & rSelectRect)1003cdf0e10cSrcweir SwEditShell::GetCorrection( const Point* pPt, SwRect& rSelectRect )
1004cdf0e10cSrcweir {
1005cdf0e10cSrcweir uno::Reference< XSpellAlternatives > xSpellAlt;
1006cdf0e10cSrcweir
1007cdf0e10cSrcweir if( IsTableMode() )
1008cdf0e10cSrcweir return NULL;
1009cdf0e10cSrcweir SwPaM* pCrsr = GetCrsr();
1010cdf0e10cSrcweir SwPosition aPos( *pCrsr->GetPoint() );
1011cdf0e10cSrcweir Point aPt( *pPt );
1012cdf0e10cSrcweir SwCrsrMoveState eTmpState( MV_SETONLYTEXT );
1013cdf0e10cSrcweir SwTxtNode *pNode;
1014cdf0e10cSrcweir SwWrongList *pWrong;
1015cdf0e10cSrcweir if( GetLayout()->GetCrsrOfst( &aPos, aPt, &eTmpState ) &&
1016cdf0e10cSrcweir 0 != (pNode = aPos.nNode.GetNode().GetTxtNode()) &&
1017cdf0e10cSrcweir 0 != (pWrong = pNode->GetWrong()) &&
1018cdf0e10cSrcweir !pNode->IsInProtectSect() )
1019cdf0e10cSrcweir {
1020cdf0e10cSrcweir xub_StrLen nBegin = aPos.nContent.GetIndex();
1021cdf0e10cSrcweir xub_StrLen nLen = 1;
1022cdf0e10cSrcweir if( pWrong->InWrongWord(nBegin,nLen) && !pNode->IsSymbol(nBegin) )
1023cdf0e10cSrcweir {
1024cdf0e10cSrcweir String aText( pNode->GetTxt().Copy( nBegin, nLen ) );
1025cdf0e10cSrcweir String aWord( aText );
1026cdf0e10cSrcweir aWord.EraseAllChars( CH_TXTATR_BREAKWORD ).EraseAllChars( CH_TXTATR_INWORD );
1027cdf0e10cSrcweir
1028cdf0e10cSrcweir uno::Reference< XSpellChecker1 > xSpell( ::GetSpellChecker() );
1029cdf0e10cSrcweir if( xSpell.is() )
1030cdf0e10cSrcweir {
1031cdf0e10cSrcweir LanguageType eActLang = (LanguageType)pNode->GetLang( nBegin, nLen );
1032cdf0e10cSrcweir if( xSpell->hasLanguage( eActLang ))
1033cdf0e10cSrcweir {
1034cdf0e10cSrcweir // restrict the maximal number of suggestions displayed
1035cdf0e10cSrcweir // in the context menu.
1036cdf0e10cSrcweir // Note: That could of course be done by clipping the
1037cdf0e10cSrcweir // resulting sequence but the current third party
1038cdf0e10cSrcweir // implementations result differs greatly if the number of
1039cdf0e10cSrcweir // suggestions to be retuned gets changed. Statistically
1040cdf0e10cSrcweir // it gets much better if told to return e.g. only 7 strings
1041cdf0e10cSrcweir // than returning e.g. 16 suggestions and using only the
1042cdf0e10cSrcweir // first 7. Thus we hand down the value to use to that
1043cdf0e10cSrcweir // implementation here by providing an additional parameter.
1044cdf0e10cSrcweir Sequence< PropertyValue > aPropVals(1);
1045cdf0e10cSrcweir PropertyValue &rVal = aPropVals.getArray()[0];
1046cdf0e10cSrcweir rVal.Name = C2U( UPN_MAX_NUMBER_OF_SUGGESTIONS );
1047cdf0e10cSrcweir rVal.Value <<= (sal_Int16) 7;
1048cdf0e10cSrcweir
1049cdf0e10cSrcweir xSpellAlt = xSpell->spell( aWord, eActLang, aPropVals );
1050cdf0e10cSrcweir }
1051cdf0e10cSrcweir }
1052cdf0e10cSrcweir
1053cdf0e10cSrcweir if ( xSpellAlt.is() ) // error found?
1054cdf0e10cSrcweir {
1055cdf0e10cSrcweir //save the start and end positons of the line and the starting point
1056cdf0e10cSrcweir Push();
1057cdf0e10cSrcweir LeftMargin();
1058cdf0e10cSrcweir xub_StrLen nLineStart = GetCrsr()->GetPoint()->nContent.GetIndex();
1059cdf0e10cSrcweir RightMargin();
1060cdf0e10cSrcweir xub_StrLen nLineEnd = GetCrsr()->GetPoint()->nContent.GetIndex();
1061cdf0e10cSrcweir Pop(sal_False);
1062cdf0e10cSrcweir
1063cdf0e10cSrcweir // make sure the selection build later from the
1064cdf0e10cSrcweir // data below does not include footnotes and other
1065cdf0e10cSrcweir // "in word" character to the left and right in order
1066cdf0e10cSrcweir // to preserve those. Therefore count those "in words"
1067cdf0e10cSrcweir // in order to modify the selection accordingly.
1068cdf0e10cSrcweir const sal_Unicode* pChar = aText.GetBuffer();
1069cdf0e10cSrcweir xub_StrLen nLeft = 0;
1070cdf0e10cSrcweir while (pChar && *pChar++ == CH_TXTATR_INWORD)
1071cdf0e10cSrcweir ++nLeft;
1072cdf0e10cSrcweir pChar = aText.Len() ? aText.GetBuffer() + aText.Len() - 1 : 0;
1073cdf0e10cSrcweir xub_StrLen nRight = 0;
1074cdf0e10cSrcweir while (pChar && *pChar-- == CH_TXTATR_INWORD)
1075cdf0e10cSrcweir ++nRight;
1076cdf0e10cSrcweir
1077cdf0e10cSrcweir aPos.nContent = nBegin + nLeft;
1078cdf0e10cSrcweir pCrsr = GetCrsr();
1079cdf0e10cSrcweir *pCrsr->GetPoint() = aPos;
1080cdf0e10cSrcweir pCrsr->SetMark();
1081cdf0e10cSrcweir ExtendSelection( sal_True, nLen - nLeft - nRight );
1082cdf0e10cSrcweir //no determine the rectangle in the current line
1083cdf0e10cSrcweir xub_StrLen nWordStart = (nBegin + nLeft) < nLineStart ? nLineStart : nBegin + nLeft;
1084cdf0e10cSrcweir //take one less than the line end - otherwise the next line would be calculated
1085cdf0e10cSrcweir xub_StrLen nWordEnd = (nBegin + nLen - nLeft - nRight) > nLineEnd ? nLineEnd - 1: (nBegin + nLen - nLeft - nRight);
1086cdf0e10cSrcweir Push();
1087cdf0e10cSrcweir pCrsr->DeleteMark();
1088cdf0e10cSrcweir SwIndex& rContent = GetCrsr()->GetPoint()->nContent;
1089cdf0e10cSrcweir rContent = nWordStart;
1090cdf0e10cSrcweir SwRect aStartRect;
1091cdf0e10cSrcweir SwCrsrMoveState aState;
1092cdf0e10cSrcweir aState.bRealWidth = sal_True;
1093cdf0e10cSrcweir SwCntntNode* pCntntNode = pCrsr->GetCntntNode();
1094cdf0e10cSrcweir SwCntntFrm *pCntntFrame = pCntntNode->getLayoutFrm( GetLayout(), pPt, pCrsr->GetPoint(), sal_False);
1095cdf0e10cSrcweir
1096cdf0e10cSrcweir pCntntFrame->GetCharRect( aStartRect, *pCrsr->GetPoint(), &aState );
1097cdf0e10cSrcweir rContent = nWordEnd;
1098cdf0e10cSrcweir SwRect aEndRect;
1099cdf0e10cSrcweir pCntntFrame->GetCharRect( aEndRect, *pCrsr->GetPoint(),&aState );
1100cdf0e10cSrcweir rSelectRect = aStartRect.Union( aEndRect );
1101cdf0e10cSrcweir Pop(sal_False);
1102cdf0e10cSrcweir }
1103cdf0e10cSrcweir }
1104cdf0e10cSrcweir }
1105cdf0e10cSrcweir return xSpellAlt;
1106cdf0e10cSrcweir }
1107cdf0e10cSrcweir
1108cdf0e10cSrcweir /*-------------------------------------------------------------------------
1109cdf0e10cSrcweir
1110cdf0e10cSrcweir -----------------------------------------------------------------------*/
1111cdf0e10cSrcweir
GetGrammarCorrection(linguistic2::ProofreadingResult & rResult,sal_Int32 & rErrorPosInText,sal_Int32 & rErrorIndexInResult,uno::Sequence<rtl::OUString> & rSuggestions,const Point * pPt,SwRect & rSelectRect)1112cdf0e10cSrcweir bool SwEditShell::GetGrammarCorrection(
1113cdf0e10cSrcweir linguistic2::ProofreadingResult /*out*/ &rResult, // the complete result
1114cdf0e10cSrcweir sal_Int32 /*out*/ &rErrorPosInText, // offset of error position in string that was grammar checked...
1115cdf0e10cSrcweir sal_Int32 /*out*/ &rErrorIndexInResult, // index of error in rResult.aGrammarErrors
1116cdf0e10cSrcweir uno::Sequence< rtl::OUString > /*out*/ &rSuggestions, // suggestions to be used for the error found
1117cdf0e10cSrcweir const Point *pPt, SwRect &rSelectRect )
1118cdf0e10cSrcweir {
1119cdf0e10cSrcweir bool bRes = false;
1120cdf0e10cSrcweir
1121cdf0e10cSrcweir if( IsTableMode() )
1122cdf0e10cSrcweir return bRes;
1123cdf0e10cSrcweir
1124cdf0e10cSrcweir SwPaM* pCrsr = GetCrsr();
1125cdf0e10cSrcweir SwPosition aPos( *pCrsr->GetPoint() );
1126cdf0e10cSrcweir Point aPt( *pPt );
1127cdf0e10cSrcweir SwCrsrMoveState eTmpState( MV_SETONLYTEXT );
1128cdf0e10cSrcweir SwTxtNode *pNode;
1129cdf0e10cSrcweir SwGrammarMarkUp *pWrong;
1130cdf0e10cSrcweir if( GetLayout()->GetCrsrOfst( &aPos, aPt, &eTmpState ) &&
1131cdf0e10cSrcweir 0 != (pNode = aPos.nNode.GetNode().GetTxtNode()) &&
1132cdf0e10cSrcweir 0 != (pWrong = pNode->GetGrammarCheck()) &&
1133cdf0e10cSrcweir !pNode->IsInProtectSect() )
1134cdf0e10cSrcweir {
1135cdf0e10cSrcweir xub_StrLen nBegin = aPos.nContent.GetIndex();
1136cdf0e10cSrcweir xub_StrLen nLen = 1;
1137cdf0e10cSrcweir if (pWrong->InWrongWord(nBegin, nLen))
1138cdf0e10cSrcweir {
1139cdf0e10cSrcweir String aText( pNode->GetTxt().Copy( nBegin, nLen ) );
1140cdf0e10cSrcweir String aWord( aText );
1141cdf0e10cSrcweir aWord.EraseAllChars( CH_TXTATR_BREAKWORD ).EraseAllChars( CH_TXTATR_INWORD );
1142cdf0e10cSrcweir
1143cdf0e10cSrcweir uno::Reference< linguistic2::XProofreadingIterator > xGCIterator( pDoc->GetGCIterator() );
1144cdf0e10cSrcweir if (xGCIterator.is())
1145cdf0e10cSrcweir {
1146cdf0e10cSrcweir // LanguageType eActLang = (LanguageType)pNode->GetLang( nBegin, nLen );
1147cdf0e10cSrcweir uno::Reference< lang::XComponent > xDoc( pDoc->GetDocShell()->GetBaseModel(), uno::UNO_QUERY );
1148cdf0e10cSrcweir
1149cdf0e10cSrcweir // Expand the string:
1150cdf0e10cSrcweir rtl::OUString aExpandText;
1151cdf0e10cSrcweir const ModelToViewHelper::ConversionMap* pConversionMap =
1152cdf0e10cSrcweir pNode->BuildConversionMap( aExpandText );
1153cdf0e10cSrcweir // get XFlatParagraph to use...
1154cdf0e10cSrcweir uno::Reference< text::XFlatParagraph > xFlatPara = new SwXFlatParagraph( *pNode, aExpandText, pConversionMap );
1155cdf0e10cSrcweir
1156cdf0e10cSrcweir // get error position of cursor in XFlatParagraph
1157cdf0e10cSrcweir rErrorPosInText = ModelToViewHelper::ConvertToViewPosition( pConversionMap, nBegin );
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir sal_Int32 nStartOfSentence = ModelToViewHelper::ConvertToViewPosition( pConversionMap, pWrong->getSentenceStart( nBegin ) );
1160cdf0e10cSrcweir sal_Int32 nEndOfSentence = ModelToViewHelper::ConvertToViewPosition( pConversionMap, pWrong->getSentenceEnd( nBegin ) );
1161cdf0e10cSrcweir if( nEndOfSentence == STRING_LEN )
1162cdf0e10cSrcweir {
1163cdf0e10cSrcweir /* if( nStartOfSentence == 0 )
1164cdf0e10cSrcweir {
1165cdf0e10cSrcweir nStartOfSentence = -1;
1166cdf0e10cSrcweir nEndOfSentence = -1;
1167cdf0e10cSrcweir }
1168cdf0e10cSrcweir else */
1169cdf0e10cSrcweir nEndOfSentence = aExpandText.getLength();
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir
1172cdf0e10cSrcweir rResult = xGCIterator->checkSentenceAtPosition(
1173cdf0e10cSrcweir xDoc, xFlatPara, aExpandText, lang::Locale(), nStartOfSentence, nEndOfSentence, rErrorPosInText );
1174cdf0e10cSrcweir bRes = true;
1175cdf0e10cSrcweir
1176cdf0e10cSrcweir // get suggestions to use for the specific error position
1177cdf0e10cSrcweir sal_Int32 nErrors = rResult.aErrors.getLength();
1178cdf0e10cSrcweir rSuggestions.realloc( 0 );
1179cdf0e10cSrcweir for (sal_Int32 i = 0; i < nErrors; ++i )
1180cdf0e10cSrcweir {
1181cdf0e10cSrcweir // return suggestions for first error that includes the given error position
1182cdf0e10cSrcweir const linguistic2::SingleProofreadingError &rError = rResult.aErrors[i];
11837a52731cSHerbert Dürr if( (rError.nErrorStart <= rErrorPosInText) &&
1184c02206c9SAriel Constenla-Haile (rErrorPosInText + nLen <= rError.nErrorStart + rError.nErrorLength))
1185cdf0e10cSrcweir {
1186cdf0e10cSrcweir rSuggestions = rError.aSuggestions;
1187cdf0e10cSrcweir rErrorIndexInResult = i;
1188cdf0e10cSrcweir break;
1189cdf0e10cSrcweir }
1190cdf0e10cSrcweir }
1191cdf0e10cSrcweir }
1192cdf0e10cSrcweir
1193cdf0e10cSrcweir if (rResult.aErrors.getLength() > 0) // error found?
1194cdf0e10cSrcweir {
1195cdf0e10cSrcweir //save the start and end positons of the line and the starting point
1196cdf0e10cSrcweir Push();
1197cdf0e10cSrcweir LeftMargin();
1198cdf0e10cSrcweir xub_StrLen nLineStart = GetCrsr()->GetPoint()->nContent.GetIndex();
1199cdf0e10cSrcweir RightMargin();
1200cdf0e10cSrcweir xub_StrLen nLineEnd = GetCrsr()->GetPoint()->nContent.GetIndex();
1201cdf0e10cSrcweir Pop(sal_False);
1202cdf0e10cSrcweir
1203cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
1204cdf0e10cSrcweir // pNode->GetGrammarCheck()->Invalidate( 0, STRING_LEN );
1205cdf0e10cSrcweir // pNode->SetGrammarCheckDirty( true );
1206cdf0e10cSrcweir #endif
1207cdf0e10cSrcweir // make sure the selection build later from the
1208cdf0e10cSrcweir // data below does not include footnotes and other
1209cdf0e10cSrcweir // "in word" character to the left and right in order
1210cdf0e10cSrcweir // to preserve those. Therefore count those "in words"
1211cdf0e10cSrcweir // in order to modify the selection accordingly.
1212cdf0e10cSrcweir const sal_Unicode* pChar = aText.GetBuffer();
1213cdf0e10cSrcweir xub_StrLen nLeft = 0;
1214cdf0e10cSrcweir while (pChar && *pChar++ == CH_TXTATR_INWORD)
1215cdf0e10cSrcweir ++nLeft;
1216cdf0e10cSrcweir pChar = aText.Len() ? aText.GetBuffer() + aText.Len() - 1 : 0;
1217cdf0e10cSrcweir xub_StrLen nRight = 0;
1218cdf0e10cSrcweir while (pChar && *pChar-- == CH_TXTATR_INWORD)
1219cdf0e10cSrcweir ++nRight;
1220cdf0e10cSrcweir
1221cdf0e10cSrcweir aPos.nContent = nBegin + nLeft;
1222cdf0e10cSrcweir pCrsr = GetCrsr();
1223cdf0e10cSrcweir *pCrsr->GetPoint() = aPos;
1224cdf0e10cSrcweir pCrsr->SetMark();
1225cdf0e10cSrcweir ExtendSelection( sal_True, nLen - nLeft - nRight );
1226cdf0e10cSrcweir //no determine the rectangle in the current line
1227cdf0e10cSrcweir xub_StrLen nWordStart = (nBegin + nLeft) < nLineStart ? nLineStart : nBegin + nLeft;
1228cdf0e10cSrcweir //take one less than the line end - otherwise the next line would be calculated
1229cdf0e10cSrcweir xub_StrLen nWordEnd = (nBegin + nLen - nLeft - nRight) > nLineEnd ? nLineEnd - 1: (nBegin + nLen - nLeft - nRight);
1230cdf0e10cSrcweir Push();
1231cdf0e10cSrcweir pCrsr->DeleteMark();
1232cdf0e10cSrcweir SwIndex& rContent = GetCrsr()->GetPoint()->nContent;
1233cdf0e10cSrcweir rContent = nWordStart;
1234cdf0e10cSrcweir SwRect aStartRect;
1235cdf0e10cSrcweir SwCrsrMoveState aState;
1236cdf0e10cSrcweir aState.bRealWidth = sal_True;
1237cdf0e10cSrcweir SwCntntNode* pCntntNode = pCrsr->GetCntntNode();
1238cdf0e10cSrcweir SwCntntFrm *pCntntFrame = pCntntNode->getLayoutFrm( GetLayout(), pPt, pCrsr->GetPoint(), sal_False);
1239cdf0e10cSrcweir
1240cdf0e10cSrcweir pCntntFrame->GetCharRect( aStartRect, *pCrsr->GetPoint(), &aState );
1241cdf0e10cSrcweir rContent = nWordEnd;
1242cdf0e10cSrcweir SwRect aEndRect;
1243cdf0e10cSrcweir pCntntFrame->GetCharRect( aEndRect, *pCrsr->GetPoint(),&aState );
1244cdf0e10cSrcweir rSelectRect = aStartRect.Union( aEndRect );
1245cdf0e10cSrcweir Pop(sal_False);
1246cdf0e10cSrcweir }
1247cdf0e10cSrcweir }
1248cdf0e10cSrcweir }
1249cdf0e10cSrcweir
1250cdf0e10cSrcweir return bRes;
1251cdf0e10cSrcweir }
1252cdf0e10cSrcweir
1253cdf0e10cSrcweir /*-- 18.09.2003 15:08:18---------------------------------------------------
1254cdf0e10cSrcweir
1255cdf0e10cSrcweir -----------------------------------------------------------------------*/
SpellSentence(::svx::SpellPortions & rPortions,bool bIsGrammarCheck)1256cdf0e10cSrcweir bool SwEditShell::SpellSentence(::svx::SpellPortions& rPortions, bool bIsGrammarCheck)
1257cdf0e10cSrcweir {
1258cdf0e10cSrcweir ASSERT( pSpellIter, "SpellIter missing" );
1259cdf0e10cSrcweir if(!pSpellIter)
1260cdf0e10cSrcweir return false;
1261cdf0e10cSrcweir bool bRet = pSpellIter->SpellSentence(rPortions, bIsGrammarCheck);
1262cdf0e10cSrcweir
1263cdf0e10cSrcweir // make Selection visible - this should simply move the
1264cdf0e10cSrcweir // cursor to the end of the sentence
1265cdf0e10cSrcweir StartAction();
1266cdf0e10cSrcweir EndAction();
1267cdf0e10cSrcweir return bRet;
1268cdf0e10cSrcweir }
1269cdf0e10cSrcweir /*-- 08.09.2008 09:35:19---------------------------------------------------
1270cdf0e10cSrcweir make SpellIter start with the current sentence when called next time
1271cdf0e10cSrcweir -----------------------------------------------------------------------*/
PutSpellingToSentenceStart()1272cdf0e10cSrcweir void SwEditShell::PutSpellingToSentenceStart()
1273cdf0e10cSrcweir {
1274cdf0e10cSrcweir ASSERT( pSpellIter, "SpellIter missing" );
1275cdf0e10cSrcweir if(!pSpellIter)
1276cdf0e10cSrcweir return;
1277cdf0e10cSrcweir pSpellIter->ToSentenceStart();
1278cdf0e10cSrcweir }
1279cdf0e10cSrcweir /*-- 02.02.2005 14:34:41---------------------------------------------------
1280cdf0e10cSrcweir
1281cdf0e10cSrcweir -----------------------------------------------------------------------*/
lcl_CountRedlines(const::svx::SpellPortions & rLastPortions)1282cdf0e10cSrcweir sal_uInt32 lcl_CountRedlines(
1283cdf0e10cSrcweir const ::svx::SpellPortions& rLastPortions)
1284cdf0e10cSrcweir {
1285cdf0e10cSrcweir sal_uInt32 nRet = 0;
1286cdf0e10cSrcweir SpellPortions::const_iterator aIter = rLastPortions.begin();
1287cdf0e10cSrcweir for( ; aIter != rLastPortions.end(); ++aIter)
1288cdf0e10cSrcweir {
1289cdf0e10cSrcweir if( aIter->bIsHidden )
1290cdf0e10cSrcweir ++nRet;
1291cdf0e10cSrcweir }
1292cdf0e10cSrcweir return nRet;
1293cdf0e10cSrcweir }
1294cdf0e10cSrcweir /*-- 18.09.2003 15:08:20---------------------------------------------------
1295cdf0e10cSrcweir
1296cdf0e10cSrcweir -----------------------------------------------------------------------*/
1297cdf0e10cSrcweir
MoveContinuationPosToEndOfCheckedSentence()1298cdf0e10cSrcweir void SwEditShell::MoveContinuationPosToEndOfCheckedSentence()
1299cdf0e10cSrcweir {
1300cdf0e10cSrcweir // give hint that continuation position for spell/grammar checking is
1301cdf0e10cSrcweir // at the end of this sentence
1302cdf0e10cSrcweir if (pSpellIter)
1303cdf0e10cSrcweir {
1304cdf0e10cSrcweir pSpellIter->SetCurr( new SwPosition( *pSpellIter->GetCurrX() ) );
1305cdf0e10cSrcweir pSpellIter->ContinueAfterThisSentence();
1306cdf0e10cSrcweir }
1307cdf0e10cSrcweir }
1308cdf0e10cSrcweir
1309cdf0e10cSrcweir
ApplyChangedSentence(const::svx::SpellPortions & rNewPortions,bool bRecheck)1310cdf0e10cSrcweir void SwEditShell::ApplyChangedSentence(const ::svx::SpellPortions& rNewPortions, bool bRecheck)
1311cdf0e10cSrcweir {
1312cdf0e10cSrcweir // Note: rNewPortions.size() == 0 is valid and happens when the whole
1313cdf0e10cSrcweir // sentence got removed in the dialog
1314cdf0e10cSrcweir
1315cdf0e10cSrcweir ASSERT( pSpellIter, "SpellIter missing" );
1316cdf0e10cSrcweir if(pSpellIter &&
1317cdf0e10cSrcweir pSpellIter->GetLastPortions().size() > 0) // no portions -> no text to be changed
1318cdf0e10cSrcweir {
1319cdf0e10cSrcweir const SpellPortions& rLastPortions = pSpellIter->GetLastPortions();
1320cdf0e10cSrcweir const SpellContentPositions rLastPositions = pSpellIter->GetLastPositions();
1321cdf0e10cSrcweir ASSERT(rLastPortions.size() > 0 &&
1322cdf0e10cSrcweir rLastPortions.size() == rLastPositions.size(),
1323cdf0e10cSrcweir "last vectors of spelling results are not set or not equal")
1324cdf0e10cSrcweir
1325cdf0e10cSrcweir // iterate over the new portions, beginning at the end to take advantage of the previously
1326cdf0e10cSrcweir // saved content positions
1327cdf0e10cSrcweir
1328cdf0e10cSrcweir pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_OVERWRITE, NULL );
1329cdf0e10cSrcweir StartAction();
1330cdf0e10cSrcweir
1331cdf0e10cSrcweir SwPaM *pCrsr = GetCrsr();
1332cdf0e10cSrcweir // save cursor position (which should be at the end of the current sentence)
1333cdf0e10cSrcweir // for later restoration
1334cdf0e10cSrcweir Push();
1335cdf0e10cSrcweir
1336cdf0e10cSrcweir sal_uInt32 nRedlinePortions = lcl_CountRedlines(rLastPortions);
1337cdf0e10cSrcweir if((rLastPortions.size() - nRedlinePortions) == rNewPortions.size())
1338cdf0e10cSrcweir {
1339cdf0e10cSrcweir DBG_ASSERT( rNewPortions.size() > 0, "rNewPortions should not be empty here" );
1340cdf0e10cSrcweir DBG_ASSERT( rLastPortions.size() > 0, "rLastPortions should not be empty here" );
1341cdf0e10cSrcweir DBG_ASSERT( rLastPositions.size() > 0, "rLastPositions should not be empty here" );
1342cdf0e10cSrcweir
1343cdf0e10cSrcweir //the simple case: the same number of elements on both sides
1344cdf0e10cSrcweir //each changed element has to be applied to the corresponding source element
1345cdf0e10cSrcweir svx::SpellPortions::const_iterator aCurrentNewPortion = rNewPortions.end();
1346cdf0e10cSrcweir SpellPortions::const_iterator aCurrentOldPortion = rLastPortions.end();
1347cdf0e10cSrcweir SpellContentPositions::const_iterator aCurrentOldPosition = rLastPositions.end();
1348cdf0e10cSrcweir do
1349cdf0e10cSrcweir {
1350cdf0e10cSrcweir --aCurrentNewPortion;
1351cdf0e10cSrcweir --aCurrentOldPortion;
1352cdf0e10cSrcweir --aCurrentOldPosition;
1353cdf0e10cSrcweir //jump over redline portions
1354cdf0e10cSrcweir while(aCurrentOldPortion->bIsHidden)
1355cdf0e10cSrcweir {
1356cdf0e10cSrcweir if (aCurrentOldPortion != rLastPortions.begin() &&
1357cdf0e10cSrcweir aCurrentOldPosition != rLastPositions.begin())
1358cdf0e10cSrcweir {
1359cdf0e10cSrcweir --aCurrentOldPortion;
1360cdf0e10cSrcweir --aCurrentOldPosition;
1361cdf0e10cSrcweir }
1362cdf0e10cSrcweir else
1363cdf0e10cSrcweir {
1364cdf0e10cSrcweir DBG_ASSERT( 0, "ApplyChangedSentence: iterator positions broken" );
1365cdf0e10cSrcweir break;
1366cdf0e10cSrcweir }
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir if ( !pCrsr->HasMark() )
1369cdf0e10cSrcweir pCrsr->SetMark();
1370cdf0e10cSrcweir pCrsr->GetPoint()->nContent = aCurrentOldPosition->nLeft;
1371cdf0e10cSrcweir pCrsr->GetMark()->nContent = aCurrentOldPosition->nRight;
1372cdf0e10cSrcweir sal_uInt16 nScriptType = GetI18NScriptTypeOfLanguage( aCurrentNewPortion->eLanguage );
1373cdf0e10cSrcweir sal_uInt16 nLangWhichId = RES_CHRATR_LANGUAGE;
1374cdf0e10cSrcweir switch(nScriptType)
1375cdf0e10cSrcweir {
1376cdf0e10cSrcweir case SCRIPTTYPE_ASIAN : nLangWhichId = RES_CHRATR_CJK_LANGUAGE; break;
1377cdf0e10cSrcweir case SCRIPTTYPE_COMPLEX : nLangWhichId = RES_CHRATR_CTL_LANGUAGE; break;
1378cdf0e10cSrcweir }
1379cdf0e10cSrcweir if(aCurrentNewPortion->sText != aCurrentOldPortion->sText)
1380cdf0e10cSrcweir {
1381cdf0e10cSrcweir //change text ...
1382cdf0e10cSrcweir pDoc->DeleteAndJoin(*pCrsr);
1383cdf0e10cSrcweir // ... and apply language if necessary
1384cdf0e10cSrcweir if(aCurrentNewPortion->eLanguage != aCurrentOldPortion->eLanguage)
138569a74367SOliver-Rainer Wittmann SetAttrItem( SvxLanguageItem(aCurrentNewPortion->eLanguage, nLangWhichId), nLangWhichId );
1386cdf0e10cSrcweir pDoc->InsertString(*pCrsr, aCurrentNewPortion->sText);
1387cdf0e10cSrcweir }
1388cdf0e10cSrcweir else if(aCurrentNewPortion->eLanguage != aCurrentOldPortion->eLanguage)
1389cdf0e10cSrcweir {
1390cdf0e10cSrcweir //apply language
139169a74367SOliver-Rainer Wittmann SetAttrItem( SvxLanguageItem(aCurrentNewPortion->eLanguage, nLangWhichId), nLangWhichId );
1392cdf0e10cSrcweir }
1393cdf0e10cSrcweir else if( aCurrentNewPortion->bIgnoreThisError )
1394cdf0e10cSrcweir {
1395cdf0e10cSrcweir //add the 'ignore' markup to the TextNode's grammar ignore markup list
1396cdf0e10cSrcweir IgnoreGrammarErrorAt( *pCrsr );
1397cdf0e10cSrcweir DBG_ERROR("TODO: add ignore mark to text node");
1398cdf0e10cSrcweir }
1399cdf0e10cSrcweir if(aCurrentNewPortion == rNewPortions.begin())
1400cdf0e10cSrcweir break;
1401cdf0e10cSrcweir }
1402cdf0e10cSrcweir while(aCurrentNewPortion != rNewPortions.begin());
1403cdf0e10cSrcweir }
1404cdf0e10cSrcweir else
1405cdf0e10cSrcweir {
1406cdf0e10cSrcweir DBG_ASSERT( rLastPositions.size() > 0, "rLastPositions should not be empty here" );
1407cdf0e10cSrcweir
1408cdf0e10cSrcweir //select the complete sentence
1409cdf0e10cSrcweir SpellContentPositions::const_iterator aCurrentEndPosition = rLastPositions.end();
1410cdf0e10cSrcweir --aCurrentEndPosition;
1411cdf0e10cSrcweir SpellContentPositions::const_iterator aCurrentStartPosition = rLastPositions.begin();
1412cdf0e10cSrcweir pCrsr->GetPoint()->nContent = aCurrentStartPosition->nLeft;
1413cdf0e10cSrcweir pCrsr->GetMark()->nContent = aCurrentEndPosition->nRight;
1414cdf0e10cSrcweir
1415cdf0e10cSrcweir //delete the sentence completely
1416cdf0e10cSrcweir pDoc->DeleteAndJoin(*pCrsr);
1417cdf0e10cSrcweir svx::SpellPortions::const_iterator aCurrentNewPortion = rNewPortions.begin();
1418cdf0e10cSrcweir while(aCurrentNewPortion != rNewPortions.end())
1419cdf0e10cSrcweir {
1420cdf0e10cSrcweir //set the language attribute
1421cdf0e10cSrcweir sal_uInt16 nScriptType = GetScriptType();
1422cdf0e10cSrcweir sal_uInt16 nLangWhichId = RES_CHRATR_LANGUAGE;
1423cdf0e10cSrcweir switch(nScriptType)
1424cdf0e10cSrcweir {
1425cdf0e10cSrcweir case SCRIPTTYPE_ASIAN : nLangWhichId = RES_CHRATR_CJK_LANGUAGE; break;
1426cdf0e10cSrcweir case SCRIPTTYPE_COMPLEX : nLangWhichId = RES_CHRATR_CTL_LANGUAGE; break;
1427cdf0e10cSrcweir }
1428cdf0e10cSrcweir SfxItemSet aSet(GetAttrPool(), nLangWhichId, nLangWhichId, 0);
1429cdf0e10cSrcweir GetCurAttr( aSet );
1430cdf0e10cSrcweir const SvxLanguageItem& rLang = static_cast<const SvxLanguageItem& >(aSet.Get(nLangWhichId));
1431cdf0e10cSrcweir if(rLang.GetLanguage() != aCurrentNewPortion->eLanguage)
143269a74367SOliver-Rainer Wittmann SetAttrItem( SvxLanguageItem(aCurrentNewPortion->eLanguage, nLangWhichId) );
1433cdf0e10cSrcweir //insert the new string
1434cdf0e10cSrcweir pDoc->InsertString(*pCrsr, aCurrentNewPortion->sText);
1435cdf0e10cSrcweir
1436cdf0e10cSrcweir //set the cursor to the end of the inserted string
1437cdf0e10cSrcweir *pCrsr->Start() = *pCrsr->End();
1438cdf0e10cSrcweir ++aCurrentNewPortion;
1439cdf0e10cSrcweir }
1440cdf0e10cSrcweir }
1441cdf0e10cSrcweir
1442cdf0e10cSrcweir // restore cursor to the end of the sentence
1443cdf0e10cSrcweir // (will work also if the sentence length has changed,
1444cdf0e10cSrcweir // since cursors get updated automatically!)
1445cdf0e10cSrcweir Pop( sal_False );
1446cdf0e10cSrcweir
1447cdf0e10cSrcweir // collapse cursor to the end of the modified sentence
1448cdf0e10cSrcweir *pCrsr->Start() = *pCrsr->End();
1449cdf0e10cSrcweir if (bRecheck)
1450cdf0e10cSrcweir {
1451cdf0e10cSrcweir //in grammar check the current sentence has to be checked again
1452cdf0e10cSrcweir GoStartSentence();
1453cdf0e10cSrcweir }
1454cdf0e10cSrcweir // set continuation position for spell/grammar checking to the end of this sentence
1455cdf0e10cSrcweir pSpellIter->SetCurr( new SwPosition( *pCrsr->Start() ) );
1456cdf0e10cSrcweir
1457cdf0e10cSrcweir pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_OVERWRITE, NULL );
1458cdf0e10cSrcweir EndAction();
1459cdf0e10cSrcweir }
1460cdf0e10cSrcweir }
1461cdf0e10cSrcweir /*-- 02.02.2005 10:46:45---------------------------------------------------
1462cdf0e10cSrcweir collect all deleted redlines of the current text node beginning at the
1463cdf0e10cSrcweir start of the cursor position
1464cdf0e10cSrcweir -----------------------------------------------------------------------*/
lcl_CollectDeletedRedlines(SwEditShell * pSh)1465cdf0e10cSrcweir SpellContentPositions lcl_CollectDeletedRedlines(SwEditShell* pSh)
1466cdf0e10cSrcweir {
1467cdf0e10cSrcweir SpellContentPositions aRedlines;
1468cdf0e10cSrcweir SwDoc* pDoc = pSh->GetDoc();
1469cdf0e10cSrcweir const bool bShowChg = IDocumentRedlineAccess::IsShowChanges( pDoc->GetRedlineMode() );
1470cdf0e10cSrcweir if ( bShowChg )
1471cdf0e10cSrcweir {
1472cdf0e10cSrcweir SwPaM *pCrsr = pSh->GetCrsr();
1473cdf0e10cSrcweir const SwPosition* pStartPos = pCrsr->Start();
1474cdf0e10cSrcweir const SwTxtNode* pTxtNode = pCrsr->GetNode()->GetTxtNode();
1475cdf0e10cSrcweir
1476cdf0e10cSrcweir sal_uInt16 nAct = pDoc->GetRedlinePos( *pTxtNode, USHRT_MAX );
1477cdf0e10cSrcweir const xub_StrLen nStartIndex = pStartPos->nContent.GetIndex();
1478cdf0e10cSrcweir for ( ; nAct < pDoc->GetRedlineTbl().Count(); nAct++ )
1479cdf0e10cSrcweir {
1480cdf0e10cSrcweir const SwRedline* pRed = pDoc->GetRedlineTbl()[ nAct ];
1481cdf0e10cSrcweir
1482cdf0e10cSrcweir if ( pRed->Start()->nNode > pTxtNode->GetIndex() )
1483cdf0e10cSrcweir break;
1484cdf0e10cSrcweir
1485cdf0e10cSrcweir if( nsRedlineType_t::REDLINE_DELETE == pRed->GetType() )
1486cdf0e10cSrcweir {
1487cdf0e10cSrcweir xub_StrLen nStart, nEnd;
1488cdf0e10cSrcweir pRed->CalcStartEnd( pTxtNode->GetIndex(), nStart, nEnd );
1489cdf0e10cSrcweir if(nStart >= nStartIndex || nEnd >= nStartIndex)
1490cdf0e10cSrcweir {
1491cdf0e10cSrcweir SpellContentPosition aAdd;
1492cdf0e10cSrcweir aAdd.nLeft = nStart;
1493cdf0e10cSrcweir aAdd.nRight = nEnd;
1494cdf0e10cSrcweir aRedlines.push_back(aAdd);
1495cdf0e10cSrcweir }
1496cdf0e10cSrcweir }
1497cdf0e10cSrcweir }
1498cdf0e10cSrcweir }
1499cdf0e10cSrcweir return aRedlines;
1500cdf0e10cSrcweir }
1501cdf0e10cSrcweir /*-- 02.02.2005 11:06:12---------------------------------------------------
1502cdf0e10cSrcweir remove the redline positions after the current selection
1503cdf0e10cSrcweir -----------------------------------------------------------------------*/
lcl_CutRedlines(SpellContentPositions & aDeletedRedlines,SwEditShell * pSh)1504cdf0e10cSrcweir void lcl_CutRedlines( SpellContentPositions& aDeletedRedlines, SwEditShell* pSh )
1505cdf0e10cSrcweir {
1506cdf0e10cSrcweir if(!aDeletedRedlines.empty())
1507cdf0e10cSrcweir {
1508cdf0e10cSrcweir SwPaM *pCrsr = pSh->GetCrsr();
1509cdf0e10cSrcweir const SwPosition* pEndPos = pCrsr->End();
1510cdf0e10cSrcweir xub_StrLen nEnd = pEndPos->nContent.GetIndex();
1511cdf0e10cSrcweir while(!aDeletedRedlines.empty() &&
1512cdf0e10cSrcweir aDeletedRedlines.back().nLeft > nEnd)
1513cdf0e10cSrcweir {
1514cdf0e10cSrcweir aDeletedRedlines.pop_back();
1515cdf0e10cSrcweir }
1516cdf0e10cSrcweir }
1517cdf0e10cSrcweir }
1518cdf0e10cSrcweir /*-- 02.02.2005 11:43:00---------------------------------------------------
1519cdf0e10cSrcweir
1520cdf0e10cSrcweir -----------------------------------------------------------------------*/
lcl_FindNextDeletedRedline(const SpellContentPositions & rDeletedRedlines,xub_StrLen nSearchFrom)1521cdf0e10cSrcweir SpellContentPosition lcl_FindNextDeletedRedline(
1522cdf0e10cSrcweir const SpellContentPositions& rDeletedRedlines,
1523cdf0e10cSrcweir xub_StrLen nSearchFrom )
1524cdf0e10cSrcweir {
1525cdf0e10cSrcweir SpellContentPosition aRet;
1526cdf0e10cSrcweir aRet.nLeft = aRet.nRight = STRING_MAXLEN;
1527cdf0e10cSrcweir if(!rDeletedRedlines.empty())
1528cdf0e10cSrcweir {
1529cdf0e10cSrcweir SpellContentPositions::const_iterator aIter = rDeletedRedlines.begin();
1530cdf0e10cSrcweir for( ; aIter != rDeletedRedlines.end(); ++aIter)
1531cdf0e10cSrcweir {
1532cdf0e10cSrcweir if(aIter->nLeft < nSearchFrom)
1533cdf0e10cSrcweir continue;
1534cdf0e10cSrcweir aRet = *aIter;
1535cdf0e10cSrcweir break;
1536cdf0e10cSrcweir }
1537cdf0e10cSrcweir }
1538cdf0e10cSrcweir return aRet;
1539cdf0e10cSrcweir }
1540cdf0e10cSrcweir /*-- 18.09.2003 15:08:20---------------------------------------------------
1541cdf0e10cSrcweir
1542cdf0e10cSrcweir -----------------------------------------------------------------------*/
SpellSentence(::svx::SpellPortions & rPortions,bool bIsGrammarCheck)1543cdf0e10cSrcweir bool SwSpellIter::SpellSentence(::svx::SpellPortions& rPortions, bool bIsGrammarCheck)
1544cdf0e10cSrcweir {
1545cdf0e10cSrcweir bool bRet = false;
1546cdf0e10cSrcweir aLastPortions.clear();
1547cdf0e10cSrcweir aLastPositions.clear();
1548cdf0e10cSrcweir
1549cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
1550cdf0e10cSrcweir if( !pMySh )
1551cdf0e10cSrcweir return false;
1552cdf0e10cSrcweir
1553cdf0e10cSrcweir ASSERT( GetEnd(), "SwEditShell::SpellSentence() ohne Start?");
1554cdf0e10cSrcweir
1555cdf0e10cSrcweir uno::Reference< XSpellAlternatives > xSpellRet;
1556cdf0e10cSrcweir linguistic2::ProofreadingResult aGrammarResult;
1557cdf0e10cSrcweir sal_Bool bGoOn = sal_True;
1558cdf0e10cSrcweir bool bGrammarErrorFound = false;
1559cdf0e10cSrcweir do {
1560cdf0e10cSrcweir SwPaM *pCrsr = pMySh->GetCrsr();
1561cdf0e10cSrcweir if ( !pCrsr->HasMark() )
1562cdf0e10cSrcweir pCrsr->SetMark();
1563cdf0e10cSrcweir
1564cdf0e10cSrcweir *pCrsr->GetPoint() = *GetCurr();
1565cdf0e10cSrcweir *pCrsr->GetMark() = *GetEnd();
1566cdf0e10cSrcweir
1567cdf0e10cSrcweir if( bBackToStartOfSentence )
1568cdf0e10cSrcweir {
1569cdf0e10cSrcweir pMySh->GoStartSentence();
1570cdf0e10cSrcweir bBackToStartOfSentence = false;
1571cdf0e10cSrcweir }
1572cdf0e10cSrcweir uno::Any aSpellRet =
1573cdf0e10cSrcweir pMySh->GetDoc()->Spell(*pCrsr,
1574cdf0e10cSrcweir xSpeller, 0, 0, bIsGrammarCheck );
1575cdf0e10cSrcweir aSpellRet >>= xSpellRet;
1576cdf0e10cSrcweir aSpellRet >>= aGrammarResult;
1577cdf0e10cSrcweir bGoOn = GetCrsrCnt() > 1;
1578cdf0e10cSrcweir bGrammarErrorFound = aGrammarResult.aErrors.getLength() > 0;
1579cdf0e10cSrcweir if( xSpellRet.is() || bGrammarErrorFound )
1580cdf0e10cSrcweir {
1581cdf0e10cSrcweir bGoOn = sal_False;
1582cdf0e10cSrcweir SwPosition* pNewPoint = new SwPosition( *pCrsr->GetPoint() );
1583cdf0e10cSrcweir SwPosition* pNewMark = new SwPosition( *pCrsr->GetMark() );
1584cdf0e10cSrcweir
1585cdf0e10cSrcweir SetCurr( pNewPoint );
1586cdf0e10cSrcweir SetCurrX( pNewMark );
1587cdf0e10cSrcweir }
1588cdf0e10cSrcweir if( bGoOn )
1589cdf0e10cSrcweir {
1590cdf0e10cSrcweir pMySh->Pop( sal_False );
1591cdf0e10cSrcweir pCrsr = pMySh->GetCrsr();
1592cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
1593cdf0e10cSrcweir pCrsr->Exchange();
1594cdf0e10cSrcweir SwPosition* pNew = new SwPosition( *pCrsr->GetPoint() );
1595cdf0e10cSrcweir SetStart( pNew );
1596cdf0e10cSrcweir pNew = new SwPosition( *pCrsr->GetMark() );
1597cdf0e10cSrcweir SetEnd( pNew );
1598cdf0e10cSrcweir pNew = new SwPosition( *GetStart() );
1599cdf0e10cSrcweir SetCurr( pNew );
1600cdf0e10cSrcweir pNew = new SwPosition( *pNew );
1601cdf0e10cSrcweir SetCurrX( pNew );
1602cdf0e10cSrcweir pCrsr->SetMark();
1603cdf0e10cSrcweir --GetCrsrCnt();
1604cdf0e10cSrcweir }
1605cdf0e10cSrcweir }
1606cdf0e10cSrcweir while ( bGoOn );
1607cdf0e10cSrcweir if(xSpellRet.is() || bGrammarErrorFound)
1608cdf0e10cSrcweir {
1609cdf0e10cSrcweir //an error has been found
1610cdf0e10cSrcweir //To fill the spell portions the beginning of the sentence has to be found
1611cdf0e10cSrcweir SwPaM *pCrsr = pMySh->GetCrsr();
1612cdf0e10cSrcweir //set the mark to the right if necessary
1613cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
1614cdf0e10cSrcweir pCrsr->Exchange();
1615cdf0e10cSrcweir //the cursor has to be collapsed on the left to go to the start of the sentence - if sentence ends inside of the error
1616cdf0e10cSrcweir pCrsr->DeleteMark();
1617cdf0e10cSrcweir pCrsr->SetMark();
1618cdf0e10cSrcweir sal_Bool bStartSent = 0 != pMySh->GoStartSentence();
1619cdf0e10cSrcweir SpellContentPositions aDeletedRedlines = lcl_CollectDeletedRedlines(pMySh);
1620cdf0e10cSrcweir if(bStartSent)
1621cdf0e10cSrcweir {
1622cdf0e10cSrcweir //create a portion from the start part
1623cdf0e10cSrcweir AddPortion(0, 0, aDeletedRedlines);
1624cdf0e10cSrcweir }
1625cdf0e10cSrcweir //Set the cursor to the error already found
1626cdf0e10cSrcweir *pCrsr->GetPoint() = *GetCurrX();
1627cdf0e10cSrcweir *pCrsr->GetMark() = *GetCurr();
1628cdf0e10cSrcweir AddPortion(xSpellRet, &aGrammarResult, aDeletedRedlines);
1629cdf0e10cSrcweir
1630cdf0e10cSrcweir
1631cdf0e10cSrcweir //save the end position of the error to continue from here
1632cdf0e10cSrcweir SwPosition aSaveStartPos = *pCrsr->End();
1633cdf0e10cSrcweir //determine the end of the current sentence
1634cdf0e10cSrcweir if ( *pCrsr->GetPoint() < *pCrsr->GetMark() )
1635cdf0e10cSrcweir pCrsr->Exchange();
1636cdf0e10cSrcweir //again collapse to start marking after the end of the error
1637cdf0e10cSrcweir pCrsr->DeleteMark();
1638cdf0e10cSrcweir pCrsr->SetMark();
1639cdf0e10cSrcweir
1640cdf0e10cSrcweir pMySh->GoEndSentence();
1641cdf0e10cSrcweir if( bGrammarErrorFound )
1642cdf0e10cSrcweir {
1643cdf0e10cSrcweir rtl::OUString aExpandText;
1644cdf0e10cSrcweir const ModelToViewHelper::ConversionMap* pConversionMap = ((SwTxtNode*)pCrsr->GetNode())->BuildConversionMap( aExpandText );
1645cdf0e10cSrcweir xub_StrLen nSentenceEnd = (xub_StrLen)ModelToViewHelper::ConvertToViewPosition( pConversionMap, aGrammarResult.nBehindEndOfSentencePosition );
1646cdf0e10cSrcweir // remove trailing space
1647cdf0e10cSrcweir if( aExpandText[nSentenceEnd - 1] == ' ' )
1648cdf0e10cSrcweir --nSentenceEnd;
1649cdf0e10cSrcweir if( pCrsr->End()->nContent.GetIndex() < nSentenceEnd )
1650cdf0e10cSrcweir {
1651cdf0e10cSrcweir pCrsr->End()->nContent.Assign(
1652cdf0e10cSrcweir pCrsr->End()->nNode.GetNode().GetCntntNode(), nSentenceEnd);
1653cdf0e10cSrcweir }
1654cdf0e10cSrcweir }
1655cdf0e10cSrcweir
1656cdf0e10cSrcweir lcl_CutRedlines( aDeletedRedlines, pMySh );
1657cdf0e10cSrcweir //save the 'global' end of the spellchecking
1658cdf0e10cSrcweir const SwPosition aSaveEndPos = *GetEnd();
1659cdf0e10cSrcweir //set the sentence end as 'local' end
1660cdf0e10cSrcweir SetEnd( new SwPosition( *pCrsr->End() ));
1661cdf0e10cSrcweir
1662cdf0e10cSrcweir *pCrsr->GetPoint() = aSaveStartPos;
1663cdf0e10cSrcweir *pCrsr->GetMark() = *GetEnd();
1664cdf0e10cSrcweir //now the rest of the sentence has to be searched for errors
1665cdf0e10cSrcweir // for each error the non-error text between the current and the last error has
1666cdf0e10cSrcweir // to be added to the portions - if necessary broken into same-language-portions
1667cdf0e10cSrcweir if( !bGrammarErrorFound ) //in grammar check there's only one error returned
1668cdf0e10cSrcweir {
1669cdf0e10cSrcweir do
1670cdf0e10cSrcweir {
1671cdf0e10cSrcweir xSpellRet = 0;
1672cdf0e10cSrcweir // don't search for grammar errors here anymore!
1673cdf0e10cSrcweir pMySh->GetDoc()->Spell(*pCrsr,
1674cdf0e10cSrcweir xSpeller, 0, 0, false ) >>= xSpellRet;
1675cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
1676cdf0e10cSrcweir pCrsr->Exchange();
1677cdf0e10cSrcweir SetCurr( new SwPosition( *pCrsr->GetPoint() ));
1678cdf0e10cSrcweir SetCurrX( new SwPosition( *pCrsr->GetMark() ));
1679cdf0e10cSrcweir
1680cdf0e10cSrcweir //if an error has been found go back to the text
1681cdf0e10cSrcweir //preceeding the error
1682cdf0e10cSrcweir if(xSpellRet.is())
1683cdf0e10cSrcweir {
1684cdf0e10cSrcweir *pCrsr->GetPoint() = aSaveStartPos;
1685cdf0e10cSrcweir *pCrsr->GetMark() = *GetCurr();
1686cdf0e10cSrcweir }
1687cdf0e10cSrcweir //add the portion
1688cdf0e10cSrcweir AddPortion(0, 0, aDeletedRedlines);
1689cdf0e10cSrcweir
1690cdf0e10cSrcweir if(xSpellRet.is())
1691cdf0e10cSrcweir {
1692cdf0e10cSrcweir *pCrsr->GetPoint() = *GetCurr();
1693cdf0e10cSrcweir *pCrsr->GetMark() = *GetCurrX();
1694cdf0e10cSrcweir AddPortion(xSpellRet, 0, aDeletedRedlines);
1695cdf0e10cSrcweir //move the cursor to the end of the error string
1696cdf0e10cSrcweir *pCrsr->GetPoint() = *GetCurrX();
1697cdf0e10cSrcweir //and save the end of the error as new start position
1698cdf0e10cSrcweir aSaveStartPos = *GetCurrX();
1699cdf0e10cSrcweir //and the end of the sentence
1700cdf0e10cSrcweir *pCrsr->GetMark() = *GetEnd();
1701cdf0e10cSrcweir }
1702cdf0e10cSrcweir // if the end of the sentence has already been reached then break here
1703cdf0e10cSrcweir if(*GetCurrX() >= *GetEnd())
1704cdf0e10cSrcweir break;
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir while(xSpellRet.is());
1707cdf0e10cSrcweir }
1708cdf0e10cSrcweir else
1709cdf0e10cSrcweir {
1710cdf0e10cSrcweir //go to the end of sentence as the grammar check returned it
1711cdf0e10cSrcweir // at this time the Point is behind the grammar error
1712cdf0e10cSrcweir // and the mark points to the sentence end as
1713cdf0e10cSrcweir if ( *pCrsr->GetPoint() < *pCrsr->GetMark() )
1714cdf0e10cSrcweir pCrsr->Exchange();
1715cdf0e10cSrcweir }
1716cdf0e10cSrcweir
1717cdf0e10cSrcweir // the part between the last error and the end of the sentence has to be added
1718cdf0e10cSrcweir *pMySh->GetCrsr()->GetPoint() = *GetEnd();
1719cdf0e10cSrcweir if(*GetCurrX() < *GetEnd())
1720cdf0e10cSrcweir {
1721cdf0e10cSrcweir AddPortion(0, 0, aDeletedRedlines);
1722cdf0e10cSrcweir }
1723cdf0e10cSrcweir //set the shell cursor to the end of the sentence to prevent a visible selection
1724cdf0e10cSrcweir *pCrsr->GetMark() = *GetEnd();
1725cdf0e10cSrcweir if( !bIsGrammarCheck )
1726cdf0e10cSrcweir {
1727cdf0e10cSrcweir //set the current position to the end of the sentence
1728cdf0e10cSrcweir SetCurr( new SwPosition(*GetEnd()) );
1729cdf0e10cSrcweir }
1730cdf0e10cSrcweir //restore the 'global' end
1731cdf0e10cSrcweir SetEnd( new SwPosition(aSaveEndPos) );
1732cdf0e10cSrcweir rPortions = aLastPortions;
1733cdf0e10cSrcweir bRet = true;
1734cdf0e10cSrcweir }
1735cdf0e10cSrcweir else
1736cdf0e10cSrcweir {
1737cdf0e10cSrcweir //if no error could be found the selection has to be corrected - at least if it's not in the body
1738cdf0e10cSrcweir *pMySh->GetCrsr()->GetPoint() = *GetEnd();
1739cdf0e10cSrcweir pMySh->GetCrsr()->DeleteMark();
1740cdf0e10cSrcweir }
1741cdf0e10cSrcweir
1742cdf0e10cSrcweir return bRet;
1743cdf0e10cSrcweir }
1744cdf0e10cSrcweir
1745cdf0e10cSrcweir /*-- 08.09.2008 09:37:15---------------------------------------------------
1746cdf0e10cSrcweir
1747cdf0e10cSrcweir -----------------------------------------------------------------------*/
ToSentenceStart()1748cdf0e10cSrcweir void SwSpellIter::ToSentenceStart()
1749cdf0e10cSrcweir {
1750cdf0e10cSrcweir bBackToStartOfSentence = true;
1751cdf0e10cSrcweir }
1752cdf0e10cSrcweir /*-- 08.10.2003 08:49:56---------------------------------------------------
1753cdf0e10cSrcweir
1754cdf0e10cSrcweir -----------------------------------------------------------------------*/
lcl_GetLanguage(SwEditShell & rSh)1755cdf0e10cSrcweir LanguageType lcl_GetLanguage(SwEditShell& rSh)
1756cdf0e10cSrcweir {
1757cdf0e10cSrcweir sal_uInt16 nScriptType = rSh.GetScriptType();
1758cdf0e10cSrcweir sal_uInt16 nLangWhichId = RES_CHRATR_LANGUAGE;
1759cdf0e10cSrcweir
1760cdf0e10cSrcweir switch(nScriptType)
1761cdf0e10cSrcweir {
1762cdf0e10cSrcweir case SCRIPTTYPE_ASIAN : nLangWhichId = RES_CHRATR_CJK_LANGUAGE; break;
1763cdf0e10cSrcweir case SCRIPTTYPE_COMPLEX : nLangWhichId = RES_CHRATR_CTL_LANGUAGE; break;
1764cdf0e10cSrcweir }
1765cdf0e10cSrcweir SfxItemSet aSet(rSh.GetAttrPool(), nLangWhichId, nLangWhichId, 0);
1766cdf0e10cSrcweir rSh.GetCurAttr( aSet );
1767cdf0e10cSrcweir const SvxLanguageItem& rLang = static_cast<const SvxLanguageItem& >(aSet.Get(nLangWhichId));
1768cdf0e10cSrcweir return rLang.GetLanguage();
1769cdf0e10cSrcweir }
1770cdf0e10cSrcweir /*-- 08.10.2003 08:53:27---------------------------------------------------
1771cdf0e10cSrcweir create a text portion at the given position
1772cdf0e10cSrcweir -----------------------------------------------------------------------*/
CreatePortion(uno::Reference<XSpellAlternatives> xAlt,linguistic2::ProofreadingResult * pGrammarResult,bool bIsField,bool bIsHidden)1773cdf0e10cSrcweir void SwSpellIter::CreatePortion(uno::Reference< XSpellAlternatives > xAlt,
1774cdf0e10cSrcweir linguistic2::ProofreadingResult* pGrammarResult,
1775cdf0e10cSrcweir bool bIsField, bool bIsHidden)
1776cdf0e10cSrcweir {
1777cdf0e10cSrcweir svx::SpellPortion aPortion;
1778cdf0e10cSrcweir String sText;
1779cdf0e10cSrcweir GetSh()->GetSelectedText( sText );
1780cdf0e10cSrcweir if(sText.Len())
1781cdf0e10cSrcweir {
1782cdf0e10cSrcweir //in case of redlined deletions the selection of an error is not
1783cdf0e10cSrcweir //the same as the _real_ word
1784cdf0e10cSrcweir if(xAlt.is())
1785cdf0e10cSrcweir aPortion.sText = xAlt->getWord();
1786cdf0e10cSrcweir else if(pGrammarResult)
1787cdf0e10cSrcweir {
1788cdf0e10cSrcweir aPortion.bIsGrammarError = true;
1789cdf0e10cSrcweir if(pGrammarResult->aErrors.getLength())
1790cdf0e10cSrcweir {
1791cdf0e10cSrcweir aPortion.aGrammarError = pGrammarResult->aErrors[0];
1792cdf0e10cSrcweir aPortion.sText = pGrammarResult->aText.copy( aPortion.aGrammarError.nErrorStart, aPortion.aGrammarError.nErrorLength );
1793cdf0e10cSrcweir aPortion.xGrammarChecker = pGrammarResult->xProofreader;
1794cdf0e10cSrcweir const beans::PropertyValue* pProperties = pGrammarResult->aProperties.getConstArray();
1795cdf0e10cSrcweir for( sal_Int32 nProp = 0; nProp < pGrammarResult->aProperties.getLength(); ++nProp )
1796cdf0e10cSrcweir {
1797cdf0e10cSrcweir if( pProperties->Name.equalsAscii("DialogTitle") )
1798cdf0e10cSrcweir {
1799cdf0e10cSrcweir pProperties->Value >>= aPortion.sDialogTitle;
1800cdf0e10cSrcweir break;
1801cdf0e10cSrcweir }
1802cdf0e10cSrcweir }
1803cdf0e10cSrcweir }
1804cdf0e10cSrcweir }
1805cdf0e10cSrcweir else
1806cdf0e10cSrcweir aPortion.sText = sText;
1807cdf0e10cSrcweir aPortion.eLanguage = lcl_GetLanguage(*GetSh());
1808cdf0e10cSrcweir aPortion.bIsField = bIsField;
1809cdf0e10cSrcweir aPortion.bIsHidden = bIsHidden;
1810cdf0e10cSrcweir aPortion.xAlternatives = xAlt;
1811cdf0e10cSrcweir SpellContentPosition aPosition;
1812cdf0e10cSrcweir SwPaM *pCrsr = GetSh()->GetCrsr();
1813cdf0e10cSrcweir aPosition.nLeft = pCrsr->Start()->nContent.GetIndex();
1814cdf0e10cSrcweir aPosition.nRight = pCrsr->End()->nContent.GetIndex();
1815cdf0e10cSrcweir aLastPortions.push_back(aPortion);
1816cdf0e10cSrcweir aLastPositions.push_back(aPosition);
1817cdf0e10cSrcweir }
1818cdf0e10cSrcweir }
1819cdf0e10cSrcweir /*-- 19.09.2003 13:05:43---------------------------------------------------
1820cdf0e10cSrcweir
1821cdf0e10cSrcweir -----------------------------------------------------------------------*/
AddPortion(uno::Reference<XSpellAlternatives> xAlt,linguistic2::ProofreadingResult * pGrammarResult,const SpellContentPositions & rDeletedRedlines)1822cdf0e10cSrcweir void SwSpellIter::AddPortion(uno::Reference< XSpellAlternatives > xAlt,
1823cdf0e10cSrcweir linguistic2::ProofreadingResult* pGrammarResult,
1824cdf0e10cSrcweir const SpellContentPositions& rDeletedRedlines)
1825cdf0e10cSrcweir {
1826cdf0e10cSrcweir SwEditShell *pMySh = GetSh();
1827cdf0e10cSrcweir String sText;
1828cdf0e10cSrcweir pMySh->GetSelectedText( sText );
1829cdf0e10cSrcweir if(sText.Len())
1830cdf0e10cSrcweir {
1831cdf0e10cSrcweir if(xAlt.is() || pGrammarResult != 0)
1832cdf0e10cSrcweir {
1833cdf0e10cSrcweir CreatePortion(xAlt, pGrammarResult, false, false);
1834cdf0e10cSrcweir }
1835cdf0e10cSrcweir else
1836cdf0e10cSrcweir {
1837cdf0e10cSrcweir SwPaM *pCrsr = GetSh()->GetCrsr();
1838cdf0e10cSrcweir if ( *pCrsr->GetPoint() > *pCrsr->GetMark() )
1839cdf0e10cSrcweir pCrsr->Exchange();
1840cdf0e10cSrcweir //save the start and end positions
1841cdf0e10cSrcweir SwPosition aStart(*pCrsr->GetPoint());
1842cdf0e10cSrcweir SwPosition aEnd(*pCrsr->GetMark());
1843cdf0e10cSrcweir //iterate over the text to find changes in language
1844cdf0e10cSrcweir //set the mark equal to the point
1845cdf0e10cSrcweir *pCrsr->GetMark() = aStart;
1846cdf0e10cSrcweir SwTxtNode* pTxtNode = pCrsr->GetNode()->GetTxtNode();
1847cdf0e10cSrcweir LanguageType eStartLanguage = lcl_GetLanguage(*GetSh());
1848cdf0e10cSrcweir SpellContentPosition aNextRedline = lcl_FindNextDeletedRedline(
1849cdf0e10cSrcweir rDeletedRedlines, aStart.nContent.GetIndex() );
1850cdf0e10cSrcweir if( aNextRedline.nLeft == aStart.nContent.GetIndex() )
1851cdf0e10cSrcweir {
1852cdf0e10cSrcweir //select until the end of the current redline
1853cdf0e10cSrcweir xub_StrLen nEnd = aEnd.nContent.GetIndex() < aNextRedline.nRight ?
1854cdf0e10cSrcweir aEnd.nContent.GetIndex() : aNextRedline.nRight;
1855cdf0e10cSrcweir pCrsr->GetPoint()->nContent.Assign( pTxtNode, nEnd );
1856cdf0e10cSrcweir CreatePortion(xAlt, pGrammarResult, false, true);
1857cdf0e10cSrcweir aStart = *pCrsr->End();
1858cdf0e10cSrcweir //search for next redline
1859cdf0e10cSrcweir aNextRedline = lcl_FindNextDeletedRedline(
1860cdf0e10cSrcweir rDeletedRedlines, aStart.nContent.GetIndex() );
1861cdf0e10cSrcweir }
1862cdf0e10cSrcweir while(*pCrsr->GetPoint() < aEnd)
1863cdf0e10cSrcweir {
1864cdf0e10cSrcweir //#125786 in table cell with fixed row height the cursor might not move forward
1865cdf0e10cSrcweir if(!GetSh()->Right(1, CRSR_SKIP_CELLS))
1866cdf0e10cSrcweir break;
1867cdf0e10cSrcweir
1868cdf0e10cSrcweir bool bField = false;
1869cdf0e10cSrcweir //read the character at the current position to check if it's a field
1870cdf0e10cSrcweir xub_Unicode cChar = pTxtNode->GetTxt().GetChar( pCrsr->GetMark()->nContent.GetIndex() );
1871cdf0e10cSrcweir if( CH_TXTATR_BREAKWORD == cChar || CH_TXTATR_INWORD == cChar)
1872cdf0e10cSrcweir {
1873cdf0e10cSrcweir const SwTxtAttr* pTxtAttr = pTxtNode->GetTxtAttrForCharAt(
1874cdf0e10cSrcweir pCrsr->GetMark()->nContent.GetIndex() );
1875cdf0e10cSrcweir const sal_uInt16 nWhich = pTxtAttr
1876cdf0e10cSrcweir ? pTxtAttr->Which()
1877cdf0e10cSrcweir : static_cast<sal_uInt16>(RES_TXTATR_END);
1878cdf0e10cSrcweir switch (nWhich)
1879cdf0e10cSrcweir {
1880cdf0e10cSrcweir case RES_TXTATR_FIELD:
1881*dec99bbdSOliver-Rainer Wittmann case RES_TXTATR_ANNOTATION:
1882cdf0e10cSrcweir case RES_TXTATR_FTN:
1883cdf0e10cSrcweir case RES_TXTATR_FLYCNT:
1884cdf0e10cSrcweir bField = true;
1885cdf0e10cSrcweir break;
1886cdf0e10cSrcweir }
1887cdf0e10cSrcweir }
1888cdf0e10cSrcweir
1889cdf0e10cSrcweir LanguageType eCurLanguage = lcl_GetLanguage(*GetSh());
1890cdf0e10cSrcweir bool bRedline = aNextRedline.nLeft == pCrsr->GetPoint()->nContent.GetIndex();
1891cdf0e10cSrcweir // create a portion if the next character
1892cdf0e10cSrcweir // - is a field,
1893cdf0e10cSrcweir // - is at the beginning of a deleted redline
1894cdf0e10cSrcweir // - has a different language
1895cdf0e10cSrcweir if(bField || bRedline || eCurLanguage != eStartLanguage)
1896cdf0e10cSrcweir {
1897cdf0e10cSrcweir eStartLanguage = eCurLanguage;
1898cdf0e10cSrcweir //go one step back - the cursor currently selects the first character
1899cdf0e10cSrcweir //with a different language
1900cdf0e10cSrcweir //in the case of redlining it's different
1901cdf0e10cSrcweir if(eCurLanguage != eStartLanguage || bField)
1902cdf0e10cSrcweir *pCrsr->GetPoint() = *pCrsr->GetMark();
1903cdf0e10cSrcweir //set to the last start
1904cdf0e10cSrcweir *pCrsr->GetMark() = aStart;
1905cdf0e10cSrcweir //create portion should only be called if a selection exists
1906cdf0e10cSrcweir //there's no selection if there's a field at the beginning
1907cdf0e10cSrcweir if(*pCrsr->Start() != *pCrsr->End())
1908cdf0e10cSrcweir CreatePortion(xAlt, pGrammarResult, false, false);
1909cdf0e10cSrcweir aStart = *pCrsr->End();
1910cdf0e10cSrcweir //now export the field - if there is any
1911cdf0e10cSrcweir if(bField)
1912cdf0e10cSrcweir {
1913cdf0e10cSrcweir *pCrsr->GetMark() = *pCrsr->GetPoint();
1914cdf0e10cSrcweir GetSh()->Right(1, CRSR_SKIP_CELLS);
1915cdf0e10cSrcweir CreatePortion(xAlt, pGrammarResult, true, false);
1916cdf0e10cSrcweir aStart = *pCrsr->End();
1917cdf0e10cSrcweir }
1918cdf0e10cSrcweir }
1919cdf0e10cSrcweir // if a redline start then create a portion for it
1920cdf0e10cSrcweir if(bRedline)
1921cdf0e10cSrcweir {
1922cdf0e10cSrcweir *pCrsr->GetMark() = *pCrsr->GetPoint();
1923cdf0e10cSrcweir //select until the end of the current redline
1924cdf0e10cSrcweir xub_StrLen nEnd = aEnd.nContent.GetIndex() < aNextRedline.nRight ?
1925cdf0e10cSrcweir aEnd.nContent.GetIndex() : aNextRedline.nRight;
1926cdf0e10cSrcweir pCrsr->GetPoint()->nContent.Assign( pTxtNode, nEnd );
1927cdf0e10cSrcweir CreatePortion(xAlt, pGrammarResult, false, true);
1928cdf0e10cSrcweir aStart = *pCrsr->End();
1929cdf0e10cSrcweir //search for next redline
1930cdf0e10cSrcweir aNextRedline = lcl_FindNextDeletedRedline(
1931cdf0e10cSrcweir rDeletedRedlines, aStart.nContent.GetIndex() );
1932cdf0e10cSrcweir }
1933cdf0e10cSrcweir *pCrsr->GetMark() = *pCrsr->GetPoint();
1934cdf0e10cSrcweir }
1935cdf0e10cSrcweir pCrsr->SetMark();
1936cdf0e10cSrcweir *pCrsr->GetMark() = aStart;
1937cdf0e10cSrcweir CreatePortion(xAlt, pGrammarResult, false, false);
1938cdf0e10cSrcweir }
1939cdf0e10cSrcweir }
1940cdf0e10cSrcweir }
1941cdf0e10cSrcweir /*-- 07.08.2008 15:01:25---------------------------------------------------
1942cdf0e10cSrcweir
1943cdf0e10cSrcweir -----------------------------------------------------------------------*/
IgnoreGrammarErrorAt(SwPaM & rErrorPosition)1944cdf0e10cSrcweir void SwEditShell::IgnoreGrammarErrorAt( SwPaM& rErrorPosition )
1945cdf0e10cSrcweir {
1946cdf0e10cSrcweir SwTxtNode *pNode;
1947cdf0e10cSrcweir SwWrongList *pWrong;
1948cdf0e10cSrcweir SwNodeIndex aIdx = rErrorPosition.Start()->nNode;
1949cdf0e10cSrcweir SwNodeIndex aEndIdx = rErrorPosition.Start()->nNode;
1950cdf0e10cSrcweir xub_StrLen nStart = rErrorPosition.Start()->nContent.GetIndex();
1951cdf0e10cSrcweir xub_StrLen nEnd = STRING_LEN;
1952cdf0e10cSrcweir while( aIdx <= aEndIdx )
1953cdf0e10cSrcweir {
1954cdf0e10cSrcweir pNode = aIdx.GetNode().GetTxtNode();
1955cdf0e10cSrcweir if( pNode ) {
1956cdf0e10cSrcweir if( aIdx == aEndIdx )
1957cdf0e10cSrcweir nEnd = rErrorPosition.End()->nContent.GetIndex();
1958cdf0e10cSrcweir pWrong = pNode->GetGrammarCheck();
1959cdf0e10cSrcweir if( pWrong )
1960cdf0e10cSrcweir pWrong->RemoveEntry( nStart, nEnd );
1961cdf0e10cSrcweir pWrong = pNode->GetWrong();
1962cdf0e10cSrcweir if( pWrong )
1963cdf0e10cSrcweir pWrong->RemoveEntry( nStart, nEnd );
1964cdf0e10cSrcweir SwTxtFrm::repaintTextFrames( *pNode );
1965cdf0e10cSrcweir }
1966cdf0e10cSrcweir ++aIdx;
1967cdf0e10cSrcweir nStart = 0;
1968cdf0e10cSrcweir }
1969cdf0e10cSrcweir }
1970cdf0e10cSrcweir
1971cdf0e10cSrcweir
1972