1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <SwSpellDialogChildWindow.hxx>
28*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
29*b1cdbd2cSJim Jagielski #include <editeng/svxacorr.hxx>
30*b1cdbd2cSJim Jagielski #include <editeng/acorrcfg.hxx>
31*b1cdbd2cSJim Jagielski #include <svx/svxids.hrc>
32*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
33*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
34*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/unolingu.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/editview.hxx>
38*b1cdbd2cSJim Jagielski #include <wrtsh.hxx>
39*b1cdbd2cSJim Jagielski #include <sfx2/printer.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/svdoutl.hxx>
41*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
42*b1cdbd2cSJim Jagielski #include <svx/svditer.hxx>
43*b1cdbd2cSJim Jagielski #include <svx/svdogrp.hxx>
44*b1cdbd2cSJim Jagielski #include <unotools/linguprops.hxx>
45*b1cdbd2cSJim Jagielski #include <unotools/lingucfg.hxx>
46*b1cdbd2cSJim Jagielski #include <doc.hxx>
47*b1cdbd2cSJim Jagielski #include <docsh.hxx>
48*b1cdbd2cSJim Jagielski #include <docary.hxx>
49*b1cdbd2cSJim Jagielski #include <frmfmt.hxx>
50*b1cdbd2cSJim Jagielski #include <dcontact.hxx>
51*b1cdbd2cSJim Jagielski #include <edtwin.hxx>
52*b1cdbd2cSJim Jagielski #include <pam.hxx>
53*b1cdbd2cSJim Jagielski #include <drawbase.hxx>
54*b1cdbd2cSJim Jagielski #include <unotextrange.hxx>
55*b1cdbd2cSJim Jagielski #include <dialog.hrc>
56*b1cdbd2cSJim Jagielski #include <cmdid.h>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
61*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
62*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::linguistic2;
63*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski SFX_IMPL_CHILDWINDOW(SwSpellDialogChildWindow, FN_SPELL_GRAMMAR_DIALOG)
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski #define SPELL_START_BODY        0   // body text area
69*b1cdbd2cSJim Jagielski #define SPELL_START_OTHER       1   // frame, footnote, header, footer
70*b1cdbd2cSJim Jagielski #define SPELL_START_DRAWTEXT    2   // started in a draw text object
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski struct SpellState
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski     bool                m_bInitialCall;
75*b1cdbd2cSJim Jagielski     bool                m_bLockFocus; //lock the focus notification while a modal dialog is active
76*b1cdbd2cSJim Jagielski     bool                m_bLostFocus;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     //restart and progress information
79*b1cdbd2cSJim Jagielski     sal_uInt16              m_SpellStartPosition;
80*b1cdbd2cSJim Jagielski     bool                m_bBodySpelled;  //body already spelled
81*b1cdbd2cSJim Jagielski     bool                m_bOtherSpelled; //frames, footnotes, headers and footers spelled
82*b1cdbd2cSJim Jagielski     bool                m_bStartedInOther; //started the spelling insided of the _other_ area
83*b1cdbd2cSJim Jagielski     bool                m_bStartedInSelection; // there was an initial text selection
84*b1cdbd2cSJim Jagielski     SwPaM*              pOtherCursor; // position where the spelling inside the _other_ area started
85*b1cdbd2cSJim Jagielski     bool                m_bDrawingsSpelled; //all drawings spelled
86*b1cdbd2cSJim Jagielski     Reference<XTextRange> m_xStartRange; //text range that marks the start of spelling
87*b1cdbd2cSJim Jagielski     const SdrObject*    m_pStartDrawing; //draw text object spelling started in
88*b1cdbd2cSJim Jagielski     ESelection          m_aStartDrawingSelection; //draw text start selection
89*b1cdbd2cSJim Jagielski     bool                m_bRestartDrawing; // the first selected drawing object is found again
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski     //lose/get focus information to decide if spelling can be continued
92*b1cdbd2cSJim Jagielski     ShellModes          m_eSelMode;
93*b1cdbd2cSJim Jagielski     const SwNode*       m_pPointNode;
94*b1cdbd2cSJim Jagielski     const SwNode*       m_pMarkNode;
95*b1cdbd2cSJim Jagielski     xub_StrLen          m_nPointPos;
96*b1cdbd2cSJim Jagielski     xub_StrLen          m_nMarkPos;
97*b1cdbd2cSJim Jagielski     const SdrOutliner*  m_pOutliner;
98*b1cdbd2cSJim Jagielski     ESelection          m_aESelection;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     //iterating over draw text objects
101*b1cdbd2cSJim Jagielski     std::list<SdrTextObj*> m_aTextObjects;
102*b1cdbd2cSJim Jagielski     bool                m_bTextObjectsCollected;
103*b1cdbd2cSJim Jagielski 
SpellStateSpellState104*b1cdbd2cSJim Jagielski     SpellState() :
105*b1cdbd2cSJim Jagielski         m_bInitialCall(true),
106*b1cdbd2cSJim Jagielski         m_bLockFocus(false),
107*b1cdbd2cSJim Jagielski         m_bLostFocus(false),
108*b1cdbd2cSJim Jagielski         m_SpellStartPosition(SPELL_START_BODY),
109*b1cdbd2cSJim Jagielski         m_bBodySpelled(false),
110*b1cdbd2cSJim Jagielski         m_bOtherSpelled(false),
111*b1cdbd2cSJim Jagielski         m_bStartedInOther(false),
112*b1cdbd2cSJim Jagielski         m_bStartedInSelection(false),
113*b1cdbd2cSJim Jagielski         pOtherCursor(0),
114*b1cdbd2cSJim Jagielski         m_bDrawingsSpelled(false),
115*b1cdbd2cSJim Jagielski         m_pStartDrawing(0),
116*b1cdbd2cSJim Jagielski         m_bRestartDrawing(false),
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski         m_eSelMode(SHELL_MODE_OBJECT), //initially invalid
119*b1cdbd2cSJim Jagielski         m_pPointNode(0),
120*b1cdbd2cSJim Jagielski         m_pMarkNode(0),
121*b1cdbd2cSJim Jagielski         m_nPointPos(0),
122*b1cdbd2cSJim Jagielski         m_nMarkPos(0),
123*b1cdbd2cSJim Jagielski         m_pOutliner(0),
124*b1cdbd2cSJim Jagielski         m_bTextObjectsCollected(false)
125*b1cdbd2cSJim Jagielski         {}
126*b1cdbd2cSJim Jagielski 
~SpellStateSpellState127*b1cdbd2cSJim Jagielski     ~SpellState() {delete pOtherCursor;}
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski     // reset state in ::InvalidateSpellDialog
ResetSpellState130*b1cdbd2cSJim Jagielski     void    Reset()
131*b1cdbd2cSJim Jagielski             {   m_bInitialCall = true;
132*b1cdbd2cSJim Jagielski                 m_bBodySpelled = m_bOtherSpelled = m_bDrawingsSpelled = false;
133*b1cdbd2cSJim Jagielski                 m_xStartRange = 0;
134*b1cdbd2cSJim Jagielski                 m_pStartDrawing = 0;
135*b1cdbd2cSJim Jagielski                 m_bRestartDrawing = false;
136*b1cdbd2cSJim Jagielski 				m_bTextObjectsCollected = false;
137*b1cdbd2cSJim Jagielski                 m_aTextObjects.clear();
138*b1cdbd2cSJim Jagielski                 m_bStartedInOther = false;
139*b1cdbd2cSJim Jagielski                 delete pOtherCursor;
140*b1cdbd2cSJim Jagielski                 pOtherCursor = 0;
141*b1cdbd2cSJim Jagielski             }
142*b1cdbd2cSJim Jagielski };
143*b1cdbd2cSJim Jagielski /*-- 30.10.2003 14:33:26---------------------------------------------------
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
lcl_LeaveDrawText(SwWrtShell & rSh)146*b1cdbd2cSJim Jagielski void lcl_LeaveDrawText(SwWrtShell& rSh)
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski     if(rSh.GetDrawView())
149*b1cdbd2cSJim Jagielski     {
150*b1cdbd2cSJim Jagielski         rSh.GetDrawView()->SdrEndTextEdit( sal_True );
151*b1cdbd2cSJim Jagielski         Point aPt(LONG_MIN, LONG_MIN);
152*b1cdbd2cSJim Jagielski         //go out of the frame
153*b1cdbd2cSJim Jagielski         rSh.SelectObj(aPt, SW_LEAVE_FRAME);
154*b1cdbd2cSJim Jagielski         rSh.EnterStdMode();
155*b1cdbd2cSJim Jagielski         rSh.GetView().AttrChangedNotify(&rSh);
156*b1cdbd2cSJim Jagielski     }
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski /*-- 09.09.2003 10:39:22---------------------------------------------------
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
SwSpellDialogChildWindow(Window * _pParent,sal_uInt16 nId,SfxBindings * pBindings,SfxChildWinInfo * pInfo)161*b1cdbd2cSJim Jagielski SwSpellDialogChildWindow::SwSpellDialogChildWindow (
162*b1cdbd2cSJim Jagielski             Window* _pParent,
163*b1cdbd2cSJim Jagielski             sal_uInt16 nId,
164*b1cdbd2cSJim Jagielski             SfxBindings* pBindings,
165*b1cdbd2cSJim Jagielski             SfxChildWinInfo* pInfo) :
166*b1cdbd2cSJim Jagielski                 svx::SpellDialogChildWindow (
167*b1cdbd2cSJim Jagielski                     _pParent, nId, pBindings, pInfo),
168*b1cdbd2cSJim Jagielski                     m_pSpellState(new SpellState)
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     String aPropName( String::CreateFromAscii(UPN_IS_GRAMMAR_INTERACTIVE ) );
172*b1cdbd2cSJim Jagielski     SvtLinguConfig().GetProperty( aPropName ) >>= m_bIsGrammarCheckingOn;
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski /*-- 09.09.2003 10:39:22---------------------------------------------------
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
~SwSpellDialogChildWindow()177*b1cdbd2cSJim Jagielski SwSpellDialogChildWindow::~SwSpellDialogChildWindow ()
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
180*b1cdbd2cSJim Jagielski     if(!m_pSpellState->m_bInitialCall && pWrtShell)
181*b1cdbd2cSJim Jagielski         pWrtShell->SpellEnd();
182*b1cdbd2cSJim Jagielski     delete m_pSpellState;
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski /*-- 09.09.2003 12:40:07---------------------------------------------------
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
GetInfo(void) const188*b1cdbd2cSJim Jagielski SfxChildWinInfo SwSpellDialogChildWindow::GetInfo (void) const
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski     SfxChildWinInfo aInfo = svx::SpellDialogChildWindow::GetInfo();
191*b1cdbd2cSJim Jagielski     aInfo.bVisible = sal_False;
192*b1cdbd2cSJim Jagielski     return aInfo;
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski /*-- 09.09.2003 10:39:40---------------------------------------------------
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
GetNextWrongSentence(bool bRecheck)199*b1cdbd2cSJim Jagielski svx::SpellPortions SwSpellDialogChildWindow::GetNextWrongSentence(bool bRecheck)
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski     svx::SpellPortions aRet;
202*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
203*b1cdbd2cSJim Jagielski     if(pWrtShell)
204*b1cdbd2cSJim Jagielski     {
205*b1cdbd2cSJim Jagielski         if (!bRecheck)
206*b1cdbd2cSJim Jagielski         {
207*b1cdbd2cSJim Jagielski             // first set continuation point for spell/grammar check to the
208*b1cdbd2cSJim Jagielski             // end of the current sentence
209*b1cdbd2cSJim Jagielski             pWrtShell->MoveContinuationPosToEndOfCheckedSentence();
210*b1cdbd2cSJim Jagielski         }
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski         ShellModes  eSelMode = pWrtShell->GetView().GetShellMode();
213*b1cdbd2cSJim Jagielski         bool bDrawText = SHELL_MODE_DRAWTEXT == eSelMode;
214*b1cdbd2cSJim Jagielski         bool bNormalText =
215*b1cdbd2cSJim Jagielski             SHELL_MODE_TABLE_TEXT == eSelMode ||
216*b1cdbd2cSJim Jagielski             SHELL_MODE_LIST_TEXT == eSelMode ||
217*b1cdbd2cSJim Jagielski             SHELL_MODE_TABLE_LIST_TEXT == eSelMode ||
218*b1cdbd2cSJim Jagielski             SHELL_MODE_TEXT == eSelMode;
219*b1cdbd2cSJim Jagielski         //Writer text outside of the body
220*b1cdbd2cSJim Jagielski         bool bOtherText = false;
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski         if( m_pSpellState->m_bInitialCall )
223*b1cdbd2cSJim Jagielski         {
224*b1cdbd2cSJim Jagielski             //if no text selection exists the cursor has to be set into the text
225*b1cdbd2cSJim Jagielski             if(!bDrawText && !bNormalText)
226*b1cdbd2cSJim Jagielski             {
227*b1cdbd2cSJim Jagielski                 if(!MakeTextSelection_Impl(*pWrtShell, eSelMode))
228*b1cdbd2cSJim Jagielski                     return aRet;
229*b1cdbd2cSJim Jagielski                 else
230*b1cdbd2cSJim Jagielski                 {
231*b1cdbd2cSJim Jagielski                     // the selection type has to be checked again - both text types are possible
232*b1cdbd2cSJim Jagielski                     if(0 != (pWrtShell->GetSelectionType()& nsSelectionType::SEL_DRW_TXT))
233*b1cdbd2cSJim Jagielski                         bDrawText = true;
234*b1cdbd2cSJim Jagielski                     bNormalText = !bDrawText;
235*b1cdbd2cSJim Jagielski                 }
236*b1cdbd2cSJim Jagielski             }
237*b1cdbd2cSJim Jagielski             if(bNormalText)
238*b1cdbd2cSJim Jagielski             {
239*b1cdbd2cSJim Jagielski                 //set cursor to the start of the sentence
240*b1cdbd2cSJim Jagielski                 if(!pWrtShell->HasSelection())
241*b1cdbd2cSJim Jagielski                     pWrtShell->GoStartSentence();
242*b1cdbd2cSJim Jagielski                 else
243*b1cdbd2cSJim Jagielski                 {
244*b1cdbd2cSJim Jagielski                     pWrtShell->ExpandToSentenceBorders();
245*b1cdbd2cSJim Jagielski                     m_pSpellState->m_bStartedInSelection = true;
246*b1cdbd2cSJim Jagielski                 }
247*b1cdbd2cSJim Jagielski                 //determine if the selection is outside of the body text
248*b1cdbd2cSJim Jagielski                 bOtherText = !(pWrtShell->GetFrmType(0,sal_True) & FRMTYPE_BODY);
249*b1cdbd2cSJim Jagielski                 m_pSpellState->m_SpellStartPosition = bOtherText ? SPELL_START_OTHER : SPELL_START_BODY;
250*b1cdbd2cSJim Jagielski                 if(bOtherText)
251*b1cdbd2cSJim Jagielski                 {
252*b1cdbd2cSJim Jagielski                     m_pSpellState->pOtherCursor = new SwPaM(*pWrtShell->GetCrsr()->GetPoint());
253*b1cdbd2cSJim Jagielski                     m_pSpellState->m_bStartedInOther = true;
254*b1cdbd2cSJim Jagielski                     pWrtShell->SpellStart( DOCPOS_OTHERSTART, DOCPOS_OTHEREND, DOCPOS_CURR, NULL );
255*b1cdbd2cSJim Jagielski                 }
256*b1cdbd2cSJim Jagielski                 else
257*b1cdbd2cSJim Jagielski 				{
258*b1cdbd2cSJim Jagielski 					SwPaM* pCrsr = pWrtShell->GetCrsr();
259*b1cdbd2cSJim Jagielski 					//mark the start position only if not at start of doc
260*b1cdbd2cSJim Jagielski 					if(!pWrtShell->IsStartOfDoc())
261*b1cdbd2cSJim Jagielski 					{
262*b1cdbd2cSJim Jagielski                         m_pSpellState->m_xStartRange =
263*b1cdbd2cSJim Jagielski                             SwXTextRange::CreateXTextRange(
264*b1cdbd2cSJim Jagielski                                 *pWrtShell->GetDoc(),
265*b1cdbd2cSJim Jagielski                                 *pCrsr->Start(), pCrsr->End());
266*b1cdbd2cSJim Jagielski 					}
267*b1cdbd2cSJim Jagielski                     pWrtShell->SpellStart( DOCPOS_START, DOCPOS_END, DOCPOS_CURR, NULL );
268*b1cdbd2cSJim Jagielski 				}
269*b1cdbd2cSJim Jagielski             }
270*b1cdbd2cSJim Jagielski             else
271*b1cdbd2cSJim Jagielski             {
272*b1cdbd2cSJim Jagielski                 SdrView* pSdrView = pWrtShell->GetDrawView();
273*b1cdbd2cSJim Jagielski                 m_pSpellState->m_SpellStartPosition = SPELL_START_DRAWTEXT;
274*b1cdbd2cSJim Jagielski                 m_pSpellState->m_pStartDrawing = pSdrView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
275*b1cdbd2cSJim Jagielski                 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
276*b1cdbd2cSJim Jagielski                 // start checking at the top of the drawing object
277*b1cdbd2cSJim Jagielski                 pOLV->SetSelection( ESelection() );
278*b1cdbd2cSJim Jagielski                 m_pSpellState->m_aStartDrawingSelection = ESelection();
279*b1cdbd2cSJim Jagielski /*
280*b1cdbd2cSJim Jagielski Note: spelling in a selection only, or starting in a mid of a drawing object requires
281*b1cdbd2cSJim Jagielski further changes elsewhere. (Especially if it should work in sc and sd as well.)
282*b1cdbd2cSJim Jagielski The code below would only be part of the solution.
283*b1cdbd2cSJim Jagielski (Keeping it a as a comment for the time being)
284*b1cdbd2cSJim Jagielski                 ESelection aCurSel( pOLV->GetSelection() );
285*b1cdbd2cSJim Jagielski                 ESelection aSentenceSel( pOLV->GetEditView().GetEditEngine()->SelectSentence( aCurSel ) );
286*b1cdbd2cSJim Jagielski                 if (!aCurSel.HasRange())
287*b1cdbd2cSJim Jagielski                 {
288*b1cdbd2cSJim Jagielski                     aSentenceSel.nEndPara = aSentenceSel.nStartPara;
289*b1cdbd2cSJim Jagielski                     aSentenceSel.nEndPos  = aSentenceSel.nStartPos;
290*b1cdbd2cSJim Jagielski                 }
291*b1cdbd2cSJim Jagielski                 pOLV->SetSelection( aSentenceSel );
292*b1cdbd2cSJim Jagielski                 m_pSpellState->m_aStartDrawingSelection = aSentenceSel;
293*b1cdbd2cSJim Jagielski */
294*b1cdbd2cSJim Jagielski             }
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski             m_pSpellState->m_bInitialCall = false;
297*b1cdbd2cSJim Jagielski         }
298*b1cdbd2cSJim Jagielski         if( bDrawText )
299*b1cdbd2cSJim Jagielski         {
300*b1cdbd2cSJim Jagielski             // spell inside of the current draw text
301*b1cdbd2cSJim Jagielski             if(!SpellDrawText_Impl(*pWrtShell, aRet))
302*b1cdbd2cSJim Jagielski             {
303*b1cdbd2cSJim Jagielski                 if(!FindNextDrawTextError_Impl(*pWrtShell) || !SpellDrawText_Impl(*pWrtShell, aRet))
304*b1cdbd2cSJim Jagielski                 {
305*b1cdbd2cSJim Jagielski                     lcl_LeaveDrawText(*pWrtShell);
306*b1cdbd2cSJim Jagielski                     //now the drawings have been spelled
307*b1cdbd2cSJim Jagielski                     m_pSpellState->m_bDrawingsSpelled = true;
308*b1cdbd2cSJim Jagielski                     //the spelling continues at the other content
309*b1cdbd2cSJim Jagielski                     //if there's any that has not been spelled yet
310*b1cdbd2cSJim Jagielski                     if(!m_pSpellState->m_bOtherSpelled && pWrtShell->HasOtherCnt())
311*b1cdbd2cSJim Jagielski                     {
312*b1cdbd2cSJim Jagielski                         pWrtShell->SpellStart(DOCPOS_OTHERSTART, DOCPOS_OTHEREND, DOCPOS_OTHERSTART, NULL );
313*b1cdbd2cSJim Jagielski                         if(!pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn))
314*b1cdbd2cSJim Jagielski 						{
315*b1cdbd2cSJim Jagielski                             pWrtShell->SpellEnd();
316*b1cdbd2cSJim Jagielski 							m_pSpellState->m_bOtherSpelled = true;
317*b1cdbd2cSJim Jagielski 						}
318*b1cdbd2cSJim Jagielski                     }
319*b1cdbd2cSJim Jagielski                     else
320*b1cdbd2cSJim Jagielski                         m_pSpellState->m_bOtherSpelled = true;
321*b1cdbd2cSJim Jagielski                     //if no result has been found try at the body text - completely
322*b1cdbd2cSJim Jagielski                     if(!m_pSpellState->m_bBodySpelled && !aRet.size())
323*b1cdbd2cSJim Jagielski                     {
324*b1cdbd2cSJim Jagielski                         pWrtShell->SpellStart(DOCPOS_START, DOCPOS_END, DOCPOS_START, NULL );
325*b1cdbd2cSJim Jagielski                         if(!pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn))
326*b1cdbd2cSJim Jagielski                         {
327*b1cdbd2cSJim Jagielski                             m_pSpellState->m_bBodySpelled = true;
328*b1cdbd2cSJim Jagielski                             pWrtShell->SpellEnd();
329*b1cdbd2cSJim Jagielski                         }
330*b1cdbd2cSJim Jagielski                     }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski                 }
333*b1cdbd2cSJim Jagielski             }
334*b1cdbd2cSJim Jagielski         }
335*b1cdbd2cSJim Jagielski         else
336*b1cdbd2cSJim Jagielski         {
337*b1cdbd2cSJim Jagielski             //spell inside of the Writer text
338*b1cdbd2cSJim Jagielski             if(!pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn))
339*b1cdbd2cSJim Jagielski             {
340*b1cdbd2cSJim Jagielski                 // if there is a selection (within body or header/footer text)
341*b1cdbd2cSJim Jagielski                 // then spell/grammar checking should not move outside of it.
342*b1cdbd2cSJim Jagielski                 if (!m_pSpellState->m_bStartedInSelection)
343*b1cdbd2cSJim Jagielski                 {
344*b1cdbd2cSJim Jagielski                     //find out which text has been spelled body or other
345*b1cdbd2cSJim Jagielski                     bOtherText = !(pWrtShell->GetFrmType(0,sal_True) & FRMTYPE_BODY);
346*b1cdbd2cSJim Jagielski                     if(bOtherText && m_pSpellState->m_bStartedInOther && m_pSpellState->pOtherCursor)
347*b1cdbd2cSJim Jagielski                     {
348*b1cdbd2cSJim Jagielski                         m_pSpellState->m_bStartedInOther = false;
349*b1cdbd2cSJim Jagielski                         pWrtShell->SetSelection(*m_pSpellState->pOtherCursor);
350*b1cdbd2cSJim Jagielski                         pWrtShell->SpellEnd();
351*b1cdbd2cSJim Jagielski                         delete m_pSpellState->pOtherCursor;
352*b1cdbd2cSJim Jagielski                         m_pSpellState->pOtherCursor = 0;
353*b1cdbd2cSJim Jagielski                         pWrtShell->SpellStart(DOCPOS_OTHERSTART, DOCPOS_CURR, DOCPOS_OTHERSTART, NULL );
354*b1cdbd2cSJim Jagielski                         pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn);
355*b1cdbd2cSJim Jagielski                     }
356*b1cdbd2cSJim Jagielski                     if(!aRet.size())
357*b1cdbd2cSJim Jagielski                     {
358*b1cdbd2cSJim Jagielski                         //end spelling
359*b1cdbd2cSJim Jagielski                         pWrtShell->SpellEnd();
360*b1cdbd2cSJim Jagielski                         if(bOtherText)
361*b1cdbd2cSJim Jagielski                         {
362*b1cdbd2cSJim Jagielski                             m_pSpellState->m_bOtherSpelled = true;
363*b1cdbd2cSJim Jagielski                             //has the body been spelled?
364*b1cdbd2cSJim Jagielski                             if(!m_pSpellState->m_bBodySpelled)
365*b1cdbd2cSJim Jagielski                             {
366*b1cdbd2cSJim Jagielski                                 pWrtShell->SpellStart(DOCPOS_START, DOCPOS_END, DOCPOS_START, NULL );
367*b1cdbd2cSJim Jagielski                                 if(!pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn))
368*b1cdbd2cSJim Jagielski                                 {
369*b1cdbd2cSJim Jagielski                                     m_pSpellState->m_bBodySpelled = true;
370*b1cdbd2cSJim Jagielski                                     pWrtShell->SpellEnd();
371*b1cdbd2cSJim Jagielski                                 }
372*b1cdbd2cSJim Jagielski                             }
373*b1cdbd2cSJim Jagielski                         }
374*b1cdbd2cSJim Jagielski                         else
375*b1cdbd2cSJim Jagielski                         {
376*b1cdbd2cSJim Jagielski                              m_pSpellState->m_bBodySpelled = true;
377*b1cdbd2cSJim Jagielski                              if(!m_pSpellState->m_bOtherSpelled && pWrtShell->HasOtherCnt())
378*b1cdbd2cSJim Jagielski                              {
379*b1cdbd2cSJim Jagielski                                 pWrtShell->SpellStart(DOCPOS_OTHERSTART, DOCPOS_OTHEREND, DOCPOS_OTHERSTART, NULL );
380*b1cdbd2cSJim Jagielski                                 if(!pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn))
381*b1cdbd2cSJim Jagielski                                 {
382*b1cdbd2cSJim Jagielski                                     pWrtShell->SpellEnd();
383*b1cdbd2cSJim Jagielski                                     m_pSpellState->m_bOtherSpelled = true;
384*b1cdbd2cSJim Jagielski                                 }
385*b1cdbd2cSJim Jagielski                              }
386*b1cdbd2cSJim Jagielski                              else
387*b1cdbd2cSJim Jagielski                                  m_pSpellState->m_bOtherSpelled = true;
388*b1cdbd2cSJim Jagielski                         }
389*b1cdbd2cSJim Jagielski                     }
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski                     //search for a draw text object that contains error and spell it
392*b1cdbd2cSJim Jagielski                     if(!aRet.size() &&
393*b1cdbd2cSJim Jagielski                             (m_pSpellState->m_bDrawingsSpelled ||
394*b1cdbd2cSJim Jagielski                             !FindNextDrawTextError_Impl(*pWrtShell) || !SpellDrawText_Impl(*pWrtShell, aRet)))
395*b1cdbd2cSJim Jagielski                     {
396*b1cdbd2cSJim Jagielski                         lcl_LeaveDrawText(*pWrtShell);
397*b1cdbd2cSJim Jagielski                         m_pSpellState->m_bDrawingsSpelled = true;
398*b1cdbd2cSJim Jagielski                     }
399*b1cdbd2cSJim Jagielski                 }
400*b1cdbd2cSJim Jagielski             }
401*b1cdbd2cSJim Jagielski         }
402*b1cdbd2cSJim Jagielski         // now only the rest of the body text can be spelled -
403*b1cdbd2cSJim Jagielski         // if the spelling started inside of the body
404*b1cdbd2cSJim Jagielski         //
405*b1cdbd2cSJim Jagielski         bool bCloseMessage = true;
406*b1cdbd2cSJim Jagielski         if(!aRet.size() && !m_pSpellState->m_bStartedInSelection)
407*b1cdbd2cSJim Jagielski         {
408*b1cdbd2cSJim Jagielski             DBG_ASSERT(m_pSpellState->m_bDrawingsSpelled &&
409*b1cdbd2cSJim Jagielski                         m_pSpellState->m_bOtherSpelled && m_pSpellState->m_bBodySpelled,
410*b1cdbd2cSJim Jagielski                         "not all parts of the document are already spelled");
411*b1cdbd2cSJim Jagielski             if(m_pSpellState->m_xStartRange.is())
412*b1cdbd2cSJim Jagielski             {
413*b1cdbd2cSJim Jagielski                 LockFocusNotification( true );
414*b1cdbd2cSJim Jagielski                 sal_uInt16 nRet = QueryBox( GetWindow(),  SW_RES(RID_QB_SPELL_CONTINUE)).Execute();
415*b1cdbd2cSJim Jagielski                 if(RET_YES == nRet)
416*b1cdbd2cSJim Jagielski                 {
417*b1cdbd2cSJim Jagielski                     SwUnoInternalPaM aPam(*pWrtShell->GetDoc());
418*b1cdbd2cSJim Jagielski                     if (::sw::XTextRangeToSwPaM(aPam,
419*b1cdbd2cSJim Jagielski                                 m_pSpellState->m_xStartRange))
420*b1cdbd2cSJim Jagielski                     {
421*b1cdbd2cSJim Jagielski                         pWrtShell->SetSelection(aPam);
422*b1cdbd2cSJim Jagielski                         pWrtShell->SpellStart(DOCPOS_START, DOCPOS_CURR, DOCPOS_START);
423*b1cdbd2cSJim Jagielski                         if(!pWrtShell->SpellSentence(aRet, m_bIsGrammarCheckingOn))
424*b1cdbd2cSJim Jagielski                             pWrtShell->SpellEnd();
425*b1cdbd2cSJim Jagielski                     }
426*b1cdbd2cSJim Jagielski                     m_pSpellState->m_xStartRange = 0;
427*b1cdbd2cSJim Jagielski                     LockFocusNotification( false );
428*b1cdbd2cSJim Jagielski                     //take care that the now valid selection is stored
429*b1cdbd2cSJim Jagielski                     LoseFocus();
430*b1cdbd2cSJim Jagielski                 }
431*b1cdbd2cSJim Jagielski                 else
432*b1cdbd2cSJim Jagielski                     bCloseMessage = false; //no closing message if a wrap around has been denied
433*b1cdbd2cSJim Jagielski             }
434*b1cdbd2cSJim Jagielski         }
435*b1cdbd2cSJim Jagielski         if(!aRet.size())
436*b1cdbd2cSJim Jagielski         {
437*b1cdbd2cSJim Jagielski             if(bCloseMessage)
438*b1cdbd2cSJim Jagielski 			{
439*b1cdbd2cSJim Jagielski 				LockFocusNotification( true );
440*b1cdbd2cSJim Jagielski                 String sInfo(SW_RES(STR_SPELLING_COMPLETED));
441*b1cdbd2cSJim Jagielski                 //#i84610#
442*b1cdbd2cSJim Jagielski                 Window* pTemp = GetWindow();    // temporary needed for g++ 3.3.5
443*b1cdbd2cSJim Jagielski                 InfoBox(pTemp, sInfo ).Execute();
444*b1cdbd2cSJim Jagielski                 LockFocusNotification( false );
445*b1cdbd2cSJim Jagielski                 //take care that the now valid selection is stored
446*b1cdbd2cSJim Jagielski                 LoseFocus();
447*b1cdbd2cSJim Jagielski 			}
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski             //close the spelling dialog
450*b1cdbd2cSJim Jagielski             GetBindings().GetDispatcher()->Execute(FN_SPELL_GRAMMAR_DIALOG, SFX_CALLMODE_ASYNCHRON);
451*b1cdbd2cSJim Jagielski         }
452*b1cdbd2cSJim Jagielski     }
453*b1cdbd2cSJim Jagielski     return aRet;
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski /*-- 09.09.2003 10:39:40---------------------------------------------------
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
ApplyChangedSentence(const svx::SpellPortions & rChanged,bool bRecheck)459*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::ApplyChangedSentence(const svx::SpellPortions& rChanged, bool bRecheck)
460*b1cdbd2cSJim Jagielski {
461*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
462*b1cdbd2cSJim Jagielski     DBG_ASSERT(!m_pSpellState->m_bInitialCall, "ApplyChangedSentence in initial call or after resume");
463*b1cdbd2cSJim Jagielski     if(pWrtShell && !m_pSpellState->m_bInitialCall)
464*b1cdbd2cSJim Jagielski     {
465*b1cdbd2cSJim Jagielski 		ShellModes  eSelMode = pWrtShell->GetView().GetShellMode();
466*b1cdbd2cSJim Jagielski 		bool bDrawText = SHELL_MODE_DRAWTEXT == eSelMode;
467*b1cdbd2cSJim Jagielski 		bool bNormalText =
468*b1cdbd2cSJim Jagielski 			SHELL_MODE_TABLE_TEXT == eSelMode ||
469*b1cdbd2cSJim Jagielski 			SHELL_MODE_LIST_TEXT == eSelMode ||
470*b1cdbd2cSJim Jagielski 			SHELL_MODE_TABLE_LIST_TEXT == eSelMode ||
471*b1cdbd2cSJim Jagielski 			SHELL_MODE_TEXT == eSelMode;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski         // evaluate if the same sentence should be rechecked or not.
474*b1cdbd2cSJim Jagielski         // Sentences that got grammar checked should always be rechecked in order
475*b1cdbd2cSJim Jagielski         // to detect possible errors that get introduced with the changes
476*b1cdbd2cSJim Jagielski         bRecheck |= pWrtShell->HasLastSentenceGotGrammarChecked();
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski 		if(bNormalText)
479*b1cdbd2cSJim Jagielski 			pWrtShell->ApplyChangedSentence(rChanged, bRecheck);
480*b1cdbd2cSJim Jagielski         else if(bDrawText )
481*b1cdbd2cSJim Jagielski         {
482*b1cdbd2cSJim Jagielski             SdrView* pDrView = pWrtShell->GetDrawView();
483*b1cdbd2cSJim Jagielski             SdrOutliner *pOutliner = pDrView->GetTextEditOutliner();
484*b1cdbd2cSJim Jagielski             pOutliner->ApplyChangedSentence(pDrView->GetTextEditOutlinerView()->GetEditView(), rChanged, bRecheck);
485*b1cdbd2cSJim Jagielski         }
486*b1cdbd2cSJim Jagielski 	}
487*b1cdbd2cSJim Jagielski }
488*b1cdbd2cSJim Jagielski /*-- 21.10.2003 09:33:57---------------------------------------------------
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
AddAutoCorrection(const String & rOld,const String & rNew,LanguageType eLanguage)491*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::AddAutoCorrection(
492*b1cdbd2cSJim Jagielski         const String& rOld, const String& rNew, LanguageType eLanguage)
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski     SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get()->GetAutoCorrect();
495*b1cdbd2cSJim Jagielski     pACorr->PutText( rOld, rNew, eLanguage );
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski /*-- 21.10.2003 09:33:59---------------------------------------------------
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
HasAutoCorrection()500*b1cdbd2cSJim Jagielski bool SwSpellDialogChildWindow::HasAutoCorrection()
501*b1cdbd2cSJim Jagielski {
502*b1cdbd2cSJim Jagielski     return true;
503*b1cdbd2cSJim Jagielski }
504*b1cdbd2cSJim Jagielski /*-- 16.06.2008 11:59:17---------------------------------------------------
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
HasGrammarChecking()507*b1cdbd2cSJim Jagielski bool SwSpellDialogChildWindow::HasGrammarChecking()
508*b1cdbd2cSJim Jagielski {
509*b1cdbd2cSJim Jagielski     return SvtLinguConfig().HasGrammarChecker();
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski /*-- 18.06.2008 12:27:11---------------------------------------------------
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
IsGrammarChecking()514*b1cdbd2cSJim Jagielski bool SwSpellDialogChildWindow::IsGrammarChecking()
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski     return m_bIsGrammarCheckingOn;
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski /*-- 18.06.2008 12:27:11---------------------------------------------------
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
SetGrammarChecking(bool bOn)521*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::SetGrammarChecking(bool bOn)
522*b1cdbd2cSJim Jagielski {
523*b1cdbd2cSJim Jagielski     uno::Any aVal;
524*b1cdbd2cSJim Jagielski     aVal <<= bOn;
525*b1cdbd2cSJim Jagielski     m_bIsGrammarCheckingOn = bOn;
526*b1cdbd2cSJim Jagielski     String aPropName( C2S(UPN_IS_GRAMMAR_INTERACTIVE ) );
527*b1cdbd2cSJim Jagielski     SvtLinguConfig().SetProperty( aPropName, aVal );
528*b1cdbd2cSJim Jagielski     // set current spell position to the start of the current sentence to
529*b1cdbd2cSJim Jagielski     // continue with this sentence after grammar checking state has been changed
530*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
531*b1cdbd2cSJim Jagielski     if(pWrtShell)
532*b1cdbd2cSJim Jagielski     {
533*b1cdbd2cSJim Jagielski         ShellModes  eSelMode = pWrtShell->GetView().GetShellMode();
534*b1cdbd2cSJim Jagielski         bool bDrawText = SHELL_MODE_DRAWTEXT == eSelMode;
535*b1cdbd2cSJim Jagielski         bool bNormalText =
536*b1cdbd2cSJim Jagielski             SHELL_MODE_TABLE_TEXT == eSelMode ||
537*b1cdbd2cSJim Jagielski             SHELL_MODE_LIST_TEXT == eSelMode ||
538*b1cdbd2cSJim Jagielski             SHELL_MODE_TABLE_LIST_TEXT == eSelMode ||
539*b1cdbd2cSJim Jagielski             SHELL_MODE_TEXT == eSelMode;
540*b1cdbd2cSJim Jagielski         if( bNormalText )
541*b1cdbd2cSJim Jagielski             pWrtShell->PutSpellingToSentenceStart();
542*b1cdbd2cSJim Jagielski         else if( bDrawText )
543*b1cdbd2cSJim Jagielski         {
544*b1cdbd2cSJim Jagielski             SdrView*     pSdrView = pWrtShell->GetDrawView();
545*b1cdbd2cSJim Jagielski             SdrOutliner* pOutliner = pSdrView ? pSdrView->GetTextEditOutliner() : 0;
546*b1cdbd2cSJim Jagielski             DBG_ASSERT(pOutliner, "No Outliner in SwSpellDialogChildWindow::SetGrammarChecking");
547*b1cdbd2cSJim Jagielski             if(pOutliner)
548*b1cdbd2cSJim Jagielski             {
549*b1cdbd2cSJim Jagielski                 pOutliner->PutSpellingToSentenceStart( pSdrView->GetTextEditOutlinerView()->GetEditView() );
550*b1cdbd2cSJim Jagielski             }
551*b1cdbd2cSJim Jagielski         }
552*b1cdbd2cSJim Jagielski     }
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski /*-- 28.10.2003 08:41:09---------------------------------------------------
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
GetFocus()557*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::GetFocus()
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski     if(m_pSpellState->m_bLockFocus)
560*b1cdbd2cSJim Jagielski         return;
561*b1cdbd2cSJim Jagielski     bool bInvalidate = false;
562*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
563*b1cdbd2cSJim Jagielski     if(pWrtShell && !m_pSpellState->m_bInitialCall)
564*b1cdbd2cSJim Jagielski     {
565*b1cdbd2cSJim Jagielski         ShellModes  eSelMode = pWrtShell->GetView().GetShellMode();
566*b1cdbd2cSJim Jagielski         if(eSelMode != m_pSpellState->m_eSelMode)
567*b1cdbd2cSJim Jagielski         {
568*b1cdbd2cSJim Jagielski             //prevent initial invalidation
569*b1cdbd2cSJim Jagielski             if(m_pSpellState->m_bLostFocus)
570*b1cdbd2cSJim Jagielski                 bInvalidate = true;
571*b1cdbd2cSJim Jagielski         }
572*b1cdbd2cSJim Jagielski         else
573*b1cdbd2cSJim Jagielski         {
574*b1cdbd2cSJim Jagielski             switch(m_pSpellState->m_eSelMode)
575*b1cdbd2cSJim Jagielski             {
576*b1cdbd2cSJim Jagielski                 case SHELL_MODE_TEXT:
577*b1cdbd2cSJim Jagielski                 case SHELL_MODE_LIST_TEXT:
578*b1cdbd2cSJim Jagielski                 case SHELL_MODE_TABLE_TEXT:
579*b1cdbd2cSJim Jagielski                 case SHELL_MODE_TABLE_LIST_TEXT:
580*b1cdbd2cSJim Jagielski                 {
581*b1cdbd2cSJim Jagielski                     SwPaM* pCursor = pWrtShell->GetCrsr();
582*b1cdbd2cSJim Jagielski                     if(m_pSpellState->m_pPointNode != pCursor->GetNode(sal_True) ||
583*b1cdbd2cSJim Jagielski                         m_pSpellState->m_pMarkNode != pCursor->GetNode(sal_False)||
584*b1cdbd2cSJim Jagielski                         m_pSpellState->m_nPointPos != pCursor->GetPoint()->nContent.GetIndex()||
585*b1cdbd2cSJim Jagielski                         m_pSpellState->m_nMarkPos != pCursor->GetMark()->nContent.GetIndex())
586*b1cdbd2cSJim Jagielski                             bInvalidate = true;
587*b1cdbd2cSJim Jagielski                 }
588*b1cdbd2cSJim Jagielski                 break;
589*b1cdbd2cSJim Jagielski                 case SHELL_MODE_DRAWTEXT:
590*b1cdbd2cSJim Jagielski                 {
591*b1cdbd2cSJim Jagielski                     SdrView*     pSdrView = pWrtShell->GetDrawView();
592*b1cdbd2cSJim Jagielski                     SdrOutliner* pOutliner = pSdrView ? pSdrView->GetTextEditOutliner() : 0;
593*b1cdbd2cSJim Jagielski                     if(!pOutliner || m_pSpellState->m_pOutliner != pOutliner)
594*b1cdbd2cSJim Jagielski                         bInvalidate = true;
595*b1cdbd2cSJim Jagielski                     else
596*b1cdbd2cSJim Jagielski                     {
597*b1cdbd2cSJim Jagielski                         OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
598*b1cdbd2cSJim Jagielski                         DBG_ASSERT(pOLV, "no OutlinerView in SwSpellDialogChildWindow::GetFocus()");
599*b1cdbd2cSJim Jagielski                         if(!pOLV || !m_pSpellState->m_aESelection.IsEqual(pOLV->GetSelection()))
600*b1cdbd2cSJim Jagielski                             bInvalidate = true;
601*b1cdbd2cSJim Jagielski                     }
602*b1cdbd2cSJim Jagielski                 }
603*b1cdbd2cSJim Jagielski                 break;
604*b1cdbd2cSJim Jagielski                 default: bInvalidate = true;
605*b1cdbd2cSJim Jagielski             }
606*b1cdbd2cSJim Jagielski         }
607*b1cdbd2cSJim Jagielski     }
608*b1cdbd2cSJim Jagielski     else
609*b1cdbd2cSJim Jagielski     {
610*b1cdbd2cSJim Jagielski         bInvalidate = true;
611*b1cdbd2cSJim Jagielski     }
612*b1cdbd2cSJim Jagielski     if(bInvalidate)
613*b1cdbd2cSJim Jagielski         InvalidateSpellDialog();
614*b1cdbd2cSJim Jagielski }
615*b1cdbd2cSJim Jagielski /*-- 28.10.2003 08:41:09---------------------------------------------------
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
LoseFocus()618*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::LoseFocus()
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski     //prevent initial invalidation
621*b1cdbd2cSJim Jagielski     m_pSpellState->m_bLostFocus = true;
622*b1cdbd2cSJim Jagielski     if(m_pSpellState->m_bLockFocus)
623*b1cdbd2cSJim Jagielski         return;
624*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
625*b1cdbd2cSJim Jagielski     if(pWrtShell)
626*b1cdbd2cSJim Jagielski     {
627*b1cdbd2cSJim Jagielski         m_pSpellState->m_eSelMode = pWrtShell->GetView().GetShellMode();
628*b1cdbd2cSJim Jagielski         m_pSpellState->m_pPointNode = m_pSpellState->m_pMarkNode = 0;
629*b1cdbd2cSJim Jagielski         m_pSpellState->m_nPointPos = m_pSpellState->m_nMarkPos = 0;
630*b1cdbd2cSJim Jagielski         m_pSpellState->m_pOutliner = 0;
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski         switch(m_pSpellState->m_eSelMode)
633*b1cdbd2cSJim Jagielski         {
634*b1cdbd2cSJim Jagielski             case SHELL_MODE_TEXT:
635*b1cdbd2cSJim Jagielski             case SHELL_MODE_LIST_TEXT:
636*b1cdbd2cSJim Jagielski             case SHELL_MODE_TABLE_TEXT:
637*b1cdbd2cSJim Jagielski             case SHELL_MODE_TABLE_LIST_TEXT:
638*b1cdbd2cSJim Jagielski             {
639*b1cdbd2cSJim Jagielski                 //store a node pointer and a pam-position to be able to check on next GetFocus();
640*b1cdbd2cSJim Jagielski                 SwPaM* pCursor = pWrtShell->GetCrsr();
641*b1cdbd2cSJim Jagielski                 m_pSpellState->m_pPointNode = pCursor->GetNode(sal_True);
642*b1cdbd2cSJim Jagielski                 m_pSpellState->m_pMarkNode = pCursor->GetNode(sal_False);
643*b1cdbd2cSJim Jagielski                 m_pSpellState->m_nPointPos = pCursor->GetPoint()->nContent.GetIndex();
644*b1cdbd2cSJim Jagielski                 m_pSpellState->m_nMarkPos = pCursor->GetMark()->nContent.GetIndex();
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski             }
647*b1cdbd2cSJim Jagielski             break;
648*b1cdbd2cSJim Jagielski             case SHELL_MODE_DRAWTEXT:
649*b1cdbd2cSJim Jagielski             {
650*b1cdbd2cSJim Jagielski                 SdrView*     pSdrView = pWrtShell->GetDrawView();
651*b1cdbd2cSJim Jagielski                 SdrOutliner* pOutliner = pSdrView->GetTextEditOutliner();
652*b1cdbd2cSJim Jagielski                 m_pSpellState->m_pOutliner = pOutliner;
653*b1cdbd2cSJim Jagielski                 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
654*b1cdbd2cSJim Jagielski                 DBG_ASSERT(pOutliner && pOLV, "no Outliner/OutlinerView in SwSpellDialogChildWindow::LoseFocus()");
655*b1cdbd2cSJim Jagielski                 if(pOLV)
656*b1cdbd2cSJim Jagielski                 {
657*b1cdbd2cSJim Jagielski                     m_pSpellState->m_aESelection = pOLV->GetSelection();
658*b1cdbd2cSJim Jagielski                 }
659*b1cdbd2cSJim Jagielski             }
660*b1cdbd2cSJim Jagielski             break;
661*b1cdbd2cSJim Jagielski             default:;//prevent warning
662*b1cdbd2cSJim Jagielski         }
663*b1cdbd2cSJim Jagielski     }
664*b1cdbd2cSJim Jagielski     else
665*b1cdbd2cSJim Jagielski         m_pSpellState->m_eSelMode = SHELL_MODE_OBJECT;
666*b1cdbd2cSJim Jagielski }
667*b1cdbd2cSJim Jagielski /*-- 18.09.2003 12:50:18---------------------------------------------------
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
InvalidateSpellDialog()670*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::InvalidateSpellDialog()
671*b1cdbd2cSJim Jagielski {
672*b1cdbd2cSJim Jagielski     SwWrtShell* pWrtShell = GetWrtShell_Impl();
673*b1cdbd2cSJim Jagielski     if(!m_pSpellState->m_bInitialCall && pWrtShell)
674*b1cdbd2cSJim Jagielski         pWrtShell->SpellEnd(0, false);
675*b1cdbd2cSJim Jagielski     m_pSpellState->Reset();
676*b1cdbd2cSJim Jagielski     svx::SpellDialogChildWindow::InvalidateSpellDialog();
677*b1cdbd2cSJim Jagielski }
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski /*-- 18.09.2003 12:54:59---------------------------------------------------
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
GetWrtShell_Impl()682*b1cdbd2cSJim Jagielski SwWrtShell* SwSpellDialogChildWindow::GetWrtShell_Impl()
683*b1cdbd2cSJim Jagielski {
684*b1cdbd2cSJim Jagielski     SfxDispatcher* pDispatch = GetBindings().GetDispatcher();
685*b1cdbd2cSJim Jagielski     SwView* pView = 0;
686*b1cdbd2cSJim Jagielski     if(pDispatch)
687*b1cdbd2cSJim Jagielski     {
688*b1cdbd2cSJim Jagielski         sal_uInt16 nShellIdx = 0;
689*b1cdbd2cSJim Jagielski         SfxShell* pShell;
690*b1cdbd2cSJim Jagielski         while(0 != (pShell = pDispatch->GetShell(nShellIdx++)))
691*b1cdbd2cSJim Jagielski             if(pShell->ISA(SwView))
692*b1cdbd2cSJim Jagielski             {
693*b1cdbd2cSJim Jagielski                 pView = static_cast<SwView* >(pShell);
694*b1cdbd2cSJim Jagielski                 break;
695*b1cdbd2cSJim Jagielski             }
696*b1cdbd2cSJim Jagielski     }
697*b1cdbd2cSJim Jagielski     return pView ? pView->GetWrtShellPtr(): 0;
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski /*-- 13.10.2003 15:19:04---------------------------------------------------
701*b1cdbd2cSJim Jagielski     set the cursor into the body text - necessary if any object is selected
702*b1cdbd2cSJim Jagielski     on start of the spelling dialog
703*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
MakeTextSelection_Impl(SwWrtShell & rShell,ShellModes eSelMode)704*b1cdbd2cSJim Jagielski bool SwSpellDialogChildWindow::MakeTextSelection_Impl(SwWrtShell& rShell, ShellModes  eSelMode)
705*b1cdbd2cSJim Jagielski {
706*b1cdbd2cSJim Jagielski     SwView& rView = rShell.GetView();
707*b1cdbd2cSJim Jagielski     switch(eSelMode)
708*b1cdbd2cSJim Jagielski     {
709*b1cdbd2cSJim Jagielski         case SHELL_MODE_TEXT:
710*b1cdbd2cSJim Jagielski         case SHELL_MODE_LIST_TEXT:
711*b1cdbd2cSJim Jagielski         case SHELL_MODE_TABLE_TEXT:
712*b1cdbd2cSJim Jagielski         case SHELL_MODE_TABLE_LIST_TEXT:
713*b1cdbd2cSJim Jagielski         case SHELL_MODE_DRAWTEXT:
714*b1cdbd2cSJim Jagielski             DBG_ERROR("text already active in SwSpellDialogChildWindow::MakeTextSelection_Impl()");
715*b1cdbd2cSJim Jagielski         break;
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski         case SHELL_MODE_FRAME:
718*b1cdbd2cSJim Jagielski         {
719*b1cdbd2cSJim Jagielski             rShell.UnSelectFrm();
720*b1cdbd2cSJim Jagielski             rShell.LeaveSelFrmMode();
721*b1cdbd2cSJim Jagielski             rView.AttrChangedNotify(&rShell);
722*b1cdbd2cSJim Jagielski         }
723*b1cdbd2cSJim Jagielski         break;
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski         case SHELL_MODE_DRAW:
726*b1cdbd2cSJim Jagielski         case SHELL_MODE_DRAW_CTRL:
727*b1cdbd2cSJim Jagielski         case SHELL_MODE_DRAW_FORM:
728*b1cdbd2cSJim Jagielski         case SHELL_MODE_BEZIER:
729*b1cdbd2cSJim Jagielski             if(FindNextDrawTextError_Impl(rShell))
730*b1cdbd2cSJim Jagielski 			{
731*b1cdbd2cSJim Jagielski                 rView.AttrChangedNotify(&rShell);
732*b1cdbd2cSJim Jagielski                 break;
733*b1cdbd2cSJim Jagielski 			}
734*b1cdbd2cSJim Jagielski         //otherwise no break to deselect the object
735*b1cdbd2cSJim Jagielski         case SHELL_MODE_GRAPHIC:
736*b1cdbd2cSJim Jagielski         case SHELL_MODE_OBJECT:
737*b1cdbd2cSJim Jagielski         {
738*b1cdbd2cSJim Jagielski             if ( rShell.IsDrawCreate() )
739*b1cdbd2cSJim Jagielski             {
740*b1cdbd2cSJim Jagielski                 rView.GetDrawFuncPtr()->BreakCreate();
741*b1cdbd2cSJim Jagielski                 rView.AttrChangedNotify(&rShell);
742*b1cdbd2cSJim Jagielski             }
743*b1cdbd2cSJim Jagielski             else if ( rShell.HasSelection() || rView.IsDrawMode() )
744*b1cdbd2cSJim Jagielski             {
745*b1cdbd2cSJim Jagielski                 SdrView *pSdrView = rShell.GetDrawView();
746*b1cdbd2cSJim Jagielski                 if(pSdrView && pSdrView->AreObjectsMarked() &&
747*b1cdbd2cSJim Jagielski                     pSdrView->GetHdlList().GetFocusHdl())
748*b1cdbd2cSJim Jagielski                 {
749*b1cdbd2cSJim Jagielski                     ((SdrHdlList&)pSdrView->GetHdlList()).ResetFocusHdl();
750*b1cdbd2cSJim Jagielski                 }
751*b1cdbd2cSJim Jagielski                 else
752*b1cdbd2cSJim Jagielski                 {
753*b1cdbd2cSJim Jagielski                     rView.LeaveDrawCreate();
754*b1cdbd2cSJim Jagielski                     Point aPt(LONG_MIN, LONG_MIN);
755*b1cdbd2cSJim Jagielski                     //go out of the frame
756*b1cdbd2cSJim Jagielski                     rShell.SelectObj(aPt, SW_LEAVE_FRAME);
757*b1cdbd2cSJim Jagielski                     SfxBindings& rBind = rView.GetViewFrame()->GetBindings();
758*b1cdbd2cSJim Jagielski                     rBind.Invalidate( SID_ATTR_SIZE );
759*b1cdbd2cSJim Jagielski                     rShell.EnterStdMode();
760*b1cdbd2cSJim Jagielski                     rView.AttrChangedNotify(&rShell);
761*b1cdbd2cSJim Jagielski                 }
762*b1cdbd2cSJim Jagielski             }
763*b1cdbd2cSJim Jagielski         }
764*b1cdbd2cSJim Jagielski         break;
765*b1cdbd2cSJim Jagielski         default:; //prevent warning
766*b1cdbd2cSJim Jagielski     }
767*b1cdbd2cSJim Jagielski     return true;
768*b1cdbd2cSJim Jagielski }
769*b1cdbd2cSJim Jagielski /*-- 13.10.2003 15:20:09---------------------------------------------------
770*b1cdbd2cSJim Jagielski     select the next draw text object that has a spelling error
771*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
FindNextDrawTextError_Impl(SwWrtShell & rSh)772*b1cdbd2cSJim Jagielski bool SwSpellDialogChildWindow::FindNextDrawTextError_Impl(SwWrtShell& rSh)
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski     bool bNextDoc = false;
775*b1cdbd2cSJim Jagielski     SdrView* pDrView = rSh.GetDrawView();
776*b1cdbd2cSJim Jagielski     if(!pDrView)
777*b1cdbd2cSJim Jagielski         return bNextDoc;
778*b1cdbd2cSJim Jagielski     SwView& rView = rSh.GetView();
779*b1cdbd2cSJim Jagielski     SwDoc* pDoc = rView.GetDocShell()->GetDoc();
780*b1cdbd2cSJim Jagielski     const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
781*b1cdbd2cSJim Jagielski     //start at the current draw object - if there is any selected
782*b1cdbd2cSJim Jagielski     SdrTextObj* pCurrentTextObj = 0;
783*b1cdbd2cSJim Jagielski     if ( rMarkList.GetMarkCount() == 1 )
784*b1cdbd2cSJim Jagielski     {
785*b1cdbd2cSJim Jagielski         SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
786*b1cdbd2cSJim Jagielski         if( pObj && pObj->ISA(SdrTextObj) )
787*b1cdbd2cSJim Jagielski             pCurrentTextObj = static_cast<SdrTextObj*>(pObj);
788*b1cdbd2cSJim Jagielski     }
789*b1cdbd2cSJim Jagielski     //at first fill the list of drawing objects
790*b1cdbd2cSJim Jagielski     if(!m_pSpellState->m_bTextObjectsCollected )
791*b1cdbd2cSJim Jagielski     {
792*b1cdbd2cSJim Jagielski         m_pSpellState->m_bTextObjectsCollected = true;
793*b1cdbd2cSJim Jagielski         std::list<SdrTextObj*> aTextObjs;
794*b1cdbd2cSJim Jagielski         SwDrawContact::GetTextObjectsFromFmt( aTextObjs, pDoc );
795*b1cdbd2cSJim Jagielski         if(pCurrentTextObj)
796*b1cdbd2cSJim Jagielski         {
797*b1cdbd2cSJim Jagielski             m_pSpellState->m_aTextObjects.remove(pCurrentTextObj);
798*b1cdbd2cSJim Jagielski             m_pSpellState->m_aTextObjects.push_back(pCurrentTextObj);
799*b1cdbd2cSJim Jagielski                                 }
800*b1cdbd2cSJim Jagielski                             }
801*b1cdbd2cSJim Jagielski     if(m_pSpellState->m_aTextObjects.size())
802*b1cdbd2cSJim Jagielski     {
803*b1cdbd2cSJim Jagielski         Reference< XSpellChecker1 >  xSpell( GetSpellChecker() );
804*b1cdbd2cSJim Jagielski         while(!bNextDoc && m_pSpellState->m_aTextObjects.size())
805*b1cdbd2cSJim Jagielski         {
806*b1cdbd2cSJim Jagielski             std::list<SdrTextObj*>::iterator aStart = m_pSpellState->m_aTextObjects.begin();
807*b1cdbd2cSJim Jagielski             SdrTextObj* pTextObj = *aStart;
808*b1cdbd2cSJim Jagielski             if(m_pSpellState->m_pStartDrawing == pTextObj)
809*b1cdbd2cSJim Jagielski                 m_pSpellState->m_bRestartDrawing = true;
810*b1cdbd2cSJim Jagielski             m_pSpellState->m_aTextObjects.erase(aStart);
811*b1cdbd2cSJim Jagielski             OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
812*b1cdbd2cSJim Jagielski             if ( pParaObj )
813*b1cdbd2cSJim Jagielski             {
814*b1cdbd2cSJim Jagielski                 bool bHasSpellError = false;
815*b1cdbd2cSJim Jagielski                 {
816*b1cdbd2cSJim Jagielski                     SdrOutliner aTmpOutliner(pDoc->GetDrawModel()->
817*b1cdbd2cSJim Jagielski                                              GetDrawOutliner().GetEmptyItemSet().GetPool(),
818*b1cdbd2cSJim Jagielski                                                 OUTLINERMODE_TEXTOBJECT );
819*b1cdbd2cSJim Jagielski                     aTmpOutliner.SetRefDevice( pDoc->getPrinter( false ) );
820*b1cdbd2cSJim Jagielski                     MapMode aMapMode (MAP_TWIP);
821*b1cdbd2cSJim Jagielski                     aTmpOutliner.SetRefMapMode(aMapMode);
822*b1cdbd2cSJim Jagielski                     aTmpOutliner.SetPaperSize( pTextObj->GetLogicRect().GetSize() );
823*b1cdbd2cSJim Jagielski                     aTmpOutliner.SetSpeller( xSpell );
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski                     OutlinerView* pOutlView = new OutlinerView( &aTmpOutliner, &(rView.GetEditWin()) );
826*b1cdbd2cSJim Jagielski                     pOutlView->GetOutliner()->SetRefDevice( rSh.getIDocumentDeviceAccess()->getPrinter( false ) );
827*b1cdbd2cSJim Jagielski                     aTmpOutliner.InsertView( pOutlView );
828*b1cdbd2cSJim Jagielski                     Point aPt;
829*b1cdbd2cSJim Jagielski                     Size aSize(1,1);
830*b1cdbd2cSJim Jagielski                     Rectangle aRect( aPt, aSize );
831*b1cdbd2cSJim Jagielski                     pOutlView->SetOutputArea( aRect );
832*b1cdbd2cSJim Jagielski                     aTmpOutliner.SetText( *pParaObj );
833*b1cdbd2cSJim Jagielski                     aTmpOutliner.ClearModifyFlag();
834*b1cdbd2cSJim Jagielski                     bHasSpellError = EE_SPELL_OK != aTmpOutliner.HasSpellErrors();
835*b1cdbd2cSJim Jagielski                     aTmpOutliner.RemoveView( pOutlView );
836*b1cdbd2cSJim Jagielski                     delete pOutlView;
837*b1cdbd2cSJim Jagielski                 }
838*b1cdbd2cSJim Jagielski                 if(bHasSpellError)
839*b1cdbd2cSJim Jagielski                 {
840*b1cdbd2cSJim Jagielski                     //now the current one has to be deselected
841*b1cdbd2cSJim Jagielski                     if(pCurrentTextObj)
842*b1cdbd2cSJim Jagielski                         pDrView->SdrEndTextEdit( sal_True );
843*b1cdbd2cSJim Jagielski                     //and the found one should be activated
844*b1cdbd2cSJim Jagielski                     rSh.MakeVisible(pTextObj->GetLogicRect());
845*b1cdbd2cSJim Jagielski                     Point aTmp( 0,0 );
846*b1cdbd2cSJim Jagielski                     rSh.SelectObj( aTmp, 0, pTextObj );
847*b1cdbd2cSJim Jagielski                     SdrPageView* pPV = pDrView->GetSdrPageView();
848*b1cdbd2cSJim Jagielski                     rView.BeginTextEdit( pTextObj, pPV, &rView.GetEditWin(), sal_False, sal_True );
849*b1cdbd2cSJim Jagielski                     rView.AttrChangedNotify(&rSh);
850*b1cdbd2cSJim Jagielski                     bNextDoc = true;
851*b1cdbd2cSJim Jagielski                 }
852*b1cdbd2cSJim Jagielski             }
853*b1cdbd2cSJim Jagielski         }
854*b1cdbd2cSJim Jagielski     }
855*b1cdbd2cSJim Jagielski     return bNextDoc;
856*b1cdbd2cSJim Jagielski }
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski /*-- 13.10.2003 15:24:27---------------------------------------------------
859*b1cdbd2cSJim Jagielski 
860*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
SpellDrawText_Impl(SwWrtShell & rSh,::svx::SpellPortions & rPortions)861*b1cdbd2cSJim Jagielski bool SwSpellDialogChildWindow::SpellDrawText_Impl(SwWrtShell& rSh, ::svx::SpellPortions& rPortions)
862*b1cdbd2cSJim Jagielski {
863*b1cdbd2cSJim Jagielski     bool bRet = false;
864*b1cdbd2cSJim Jagielski     SdrView*     pSdrView = rSh.GetDrawView();
865*b1cdbd2cSJim Jagielski     SdrOutliner* pOutliner = pSdrView ? pSdrView->GetTextEditOutliner() : 0;
866*b1cdbd2cSJim Jagielski     DBG_ASSERT(pOutliner, "No Outliner in SwSpellDialogChildWindow::SpellDrawText_Impl");
867*b1cdbd2cSJim Jagielski     if(pOutliner)
868*b1cdbd2cSJim Jagielski     {
869*b1cdbd2cSJim Jagielski         bRet = pOutliner->SpellSentence(pSdrView->GetTextEditOutlinerView()->GetEditView(), rPortions, m_bIsGrammarCheckingOn);
870*b1cdbd2cSJim Jagielski         //find out if the current selection is in the first spelled drawing object
871*b1cdbd2cSJim Jagielski         //and behind the initial selection
872*b1cdbd2cSJim Jagielski         if(bRet && m_pSpellState->m_bRestartDrawing)
873*b1cdbd2cSJim Jagielski         {
874*b1cdbd2cSJim Jagielski             OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
875*b1cdbd2cSJim Jagielski             ESelection aCurrentSelection = pOLV->GetSelection();
876*b1cdbd2cSJim Jagielski             if(m_pSpellState->m_aStartDrawingSelection.nEndPara < aCurrentSelection.nEndPara ||
877*b1cdbd2cSJim Jagielski                (m_pSpellState->m_aStartDrawingSelection.nEndPara ==  aCurrentSelection.nEndPara &&
878*b1cdbd2cSJim Jagielski                     m_pSpellState->m_aStartDrawingSelection.nEndPos <  aCurrentSelection.nEndPos))
879*b1cdbd2cSJim Jagielski 			{
880*b1cdbd2cSJim Jagielski                 bRet = false;
881*b1cdbd2cSJim Jagielski 				rPortions.clear();
882*b1cdbd2cSJim Jagielski 			}
883*b1cdbd2cSJim Jagielski         }
884*b1cdbd2cSJim Jagielski     }
885*b1cdbd2cSJim Jagielski     return bRet;
886*b1cdbd2cSJim Jagielski }
887*b1cdbd2cSJim Jagielski /*-- 30.10.2003 14:54:59---------------------------------------------------
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski   -----------------------------------------------------------------------*/
LockFocusNotification(bool bLock)890*b1cdbd2cSJim Jagielski void SwSpellDialogChildWindow::LockFocusNotification(bool bLock)
891*b1cdbd2cSJim Jagielski {
892*b1cdbd2cSJim Jagielski     DBG_ASSERT(m_pSpellState->m_bLockFocus != bLock, "invalid locking - no change of state");
893*b1cdbd2cSJim Jagielski     m_pSpellState->m_bLockFocus = bLock;
894*b1cdbd2cSJim Jagielski }
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski 
897