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