1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 27 #include <string.h> 28 29 #include <vcl/window.hxx> 30 31 #include <wrtsh.hxx> 32 33 #include <sfx2/bindings.hxx> 34 #include <sfx2/dispatch.hxx> 35 #include <sfx2/request.hxx> 36 #include <editeng/eeitem.hxx> 37 #include <editeng/editeng.hxx> 38 #include <editeng/editdata.hxx> 39 #include <editeng/outliner.hxx> 40 #include <editeng/editview.hxx> 41 #include <editeng/scripttypeitem.hxx> 42 #include <editeng/langitem.hxx> 43 44 #include <svl/languageoptions.hxx> 45 #include <svtools/langtab.hxx> 46 #include <svl/slstitm.hxx> 47 #include <svl/svstdarr.hxx> 48 #include <svl/stritem.hxx> 49 50 #include <ndtxt.hxx> 51 #include <pam.hxx> 52 #include <view.hxx> 53 #include <viewopt.hxx> 54 55 #include "swabstdlg.hxx" 56 57 #include <vcl/msgbox.hxx> 58 59 #include <langhelper.hxx> 60 61 using namespace ::com::sun::star; 62 63 namespace SwLangHelper 64 { 65 GetLanguageStatus(OutlinerView * pOLV,SfxItemSet & rSet)66 sal_uInt16 GetLanguageStatus( OutlinerView* pOLV, SfxItemSet& rSet ) 67 { 68 ESelection aSelection = pOLV->GetSelection(); 69 EditView& rEditView=pOLV->GetEditView(); 70 EditEngine* pEditEngine=rEditView.GetEditEngine(); 71 72 // the value of used script types 73 const sal_uInt16 nScriptType =pOLV->GetSelectedScriptType(); 74 String aScriptTypesInUse( String::CreateFromInt32( nScriptType ) );//pEditEngine->GetScriptType(aSelection) 75 76 SvtLanguageTable aLangTable; 77 78 // get keyboard language 79 String aKeyboardLang; 80 LanguageType nLang = LANGUAGE_DONTKNOW; 81 82 Window* pWin = rEditView.GetWindow(); 83 if(pWin) 84 nLang = pWin->GetInputLanguage(); 85 if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) 86 aKeyboardLang = aLangTable.GetString( nLang ); 87 88 // get the language that is in use 89 const String aMultipleLanguages = String::CreateFromAscii("*"); 90 String aCurrentLang = aMultipleLanguages; 91 SfxItemSet aSet(pOLV->GetAttribs()); 92 nLang = SwLangHelper::GetCurrentLanguage( aSet,nScriptType ); 93 if (nLang != LANGUAGE_DONTKNOW) 94 aCurrentLang = aLangTable.GetString( nLang ); 95 96 // build sequence for status value 97 uno::Sequence< ::rtl::OUString > aSeq( 4 ); 98 aSeq[0] = aCurrentLang; 99 aSeq[1] = aScriptTypesInUse; 100 aSeq[2] = aKeyboardLang; 101 aSeq[3] = SwLangHelper::GetTextForLanguageGuessing( pEditEngine, aSelection ); 102 103 // set sequence as status value 104 SfxStringListItem aItem( SID_LANGUAGE_STATUS ); 105 aItem.SetStringList( aSeq ); 106 rSet.Put( aItem, SID_LANGUAGE_STATUS ); 107 return 0; 108 } 109 SetLanguageStatus(OutlinerView * pOLV,SfxRequest & rReq,SwView & rView,SwWrtShell & rSh)110 bool SetLanguageStatus( OutlinerView* pOLV, SfxRequest &rReq, SwView &rView, SwWrtShell &rSh ) 111 { 112 bool bRestoreSelection = false; 113 SfxItemSet aEditAttr(pOLV->GetAttribs()); 114 ESelection aSelection = pOLV->GetSelection(); 115 EditView & rEditView = pOLV->GetEditView(); 116 EditEngine * pEditEngine = rEditView.GetEditEngine(); 117 118 // get the language 119 String aNewLangTxt; 120 121 SFX_REQUEST_ARG( rReq, pItem, SfxStringItem, SID_LANGUAGE_STATUS , sal_False ); 122 if (pItem) 123 aNewLangTxt = pItem->GetValue(); 124 125 //!! Remember the view frame right now... 126 //!! (call to GetView().GetViewFrame() will break if the 127 //!! SwTextShell got destroyed meanwhile.) 128 SfxViewFrame *pViewFrame = rView.GetViewFrame(); 129 130 if (aNewLangTxt.EqualsAscii( "*" )) 131 { 132 // open the dialog "Tools/Options/Language Settings - Language" 133 SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); 134 if (pFact) 135 { 136 VclAbstractDialog* pDlg = pFact->CreateVclDialog( rView.GetWindow(), SID_LANGUAGE_OPTIONS ); 137 pDlg->Execute(); 138 delete pDlg; 139 } 140 } 141 else 142 { 143 // setting the new language... 144 if (aNewLangTxt.Len() > 0) 145 { 146 const String aSelectionLangPrefix( String::CreateFromAscii("Current_") ); 147 const String aParagraphLangPrefix( String::CreateFromAscii("Paragraph_") ); 148 const String aDocumentLangPrefix( String::CreateFromAscii("Default_") ); 149 const String aStrNone( String::CreateFromAscii("LANGUAGE_NONE") ); 150 const String aStrResetLangs( String::CreateFromAscii("RESET_LANGUAGES") ); 151 152 xub_StrLen nPos = 0; 153 bool bForSelection = true; 154 bool bForParagraph = false; 155 if (STRING_NOTFOUND != (nPos = aNewLangTxt.Search( aSelectionLangPrefix, 0 ))) 156 { 157 // ... for the current selection 158 aNewLangTxt = aNewLangTxt.Erase( nPos, aSelectionLangPrefix.Len() ); 159 bForSelection = true; 160 } 161 else if (STRING_NOTFOUND != (nPos = aNewLangTxt.Search( aParagraphLangPrefix , 0 ))) 162 { 163 // ... for the current paragraph language 164 aNewLangTxt = aNewLangTxt.Erase( nPos, aParagraphLangPrefix.Len() ); 165 bForSelection = true; 166 bForParagraph = true; 167 } 168 else if (STRING_NOTFOUND != (nPos = aNewLangTxt.Search( aDocumentLangPrefix , 0 ))) 169 { 170 // ... as default document language 171 aNewLangTxt = aNewLangTxt.Erase( nPos, aDocumentLangPrefix.Len() ); 172 bForSelection = false; 173 } 174 175 if (bForParagraph) 176 { 177 bRestoreSelection = true; 178 SwLangHelper::SelectPara( rEditView, aSelection ); 179 aSelection = pOLV->GetSelection(); 180 } 181 if (!bForSelection) // document language to be changed... 182 { 183 rSh.StartAction(); 184 rSh.LockView( sal_True ); 185 rSh.Push(); 186 187 // prepare to apply new language to all text in document 188 rSh.SelAll(); 189 rSh.ExtendedSelectAll(); 190 } 191 192 if (aNewLangTxt == aStrNone) 193 SwLangHelper::SetLanguage_None( rSh, pOLV, aSelection, bForSelection, aEditAttr ); 194 else if (aNewLangTxt == aStrResetLangs) 195 SwLangHelper::ResetLanguages( rSh, pOLV, aSelection, bForSelection ); 196 else 197 SwLangHelper::SetLanguage( rSh, pOLV, aSelection, aNewLangTxt, bForSelection, aEditAttr ); 198 199 // ugly hack, as it seems that EditView/EditEngine does not update their spellchecking marks 200 // when setting a new language attribute 201 if (bForSelection) 202 { 203 const SwViewOption* pVOpt = rView.GetWrtShellPtr()->GetViewOptions(); 204 sal_uLong nCntrl = pEditEngine->GetControlWord(); 205 // turn off 206 if (!pVOpt->IsOnlineSpell()) 207 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 208 else 209 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 210 pEditEngine->SetControlWord(nCntrl); 211 212 //turn back on 213 if (pVOpt->IsOnlineSpell()) 214 nCntrl |= EE_CNTRL_ONLINESPELLING; 215 else 216 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 217 pEditEngine->SetControlWord(nCntrl); 218 219 pEditEngine->CompleteOnlineSpelling(); 220 rEditView.Invalidate(); 221 } 222 223 if (!bForSelection) 224 { 225 // need to release view and restore selection... 226 rSh.Pop( sal_False ); 227 rSh.LockView( sal_False ); 228 rSh.EndAction(); 229 } 230 } 231 } 232 233 // invalidate slot to get the new language displayed 234 pViewFrame->GetBindings().Invalidate( rReq.GetSlot() ); 235 236 rReq.Done(); 237 return bRestoreSelection; 238 } 239 240 SetLanguage(SwWrtShell & rWrtSh,const String & rLangText,bool bIsForSelection,SfxItemSet & rCoreSet)241 void SetLanguage( SwWrtShell &rWrtSh, const String &rLangText, bool bIsForSelection, SfxItemSet &rCoreSet ) 242 { 243 SetLanguage( rWrtSh, 0 , ESelection(), rLangText, bIsForSelection, rCoreSet ); 244 } 245 SetLanguage(SwWrtShell & rWrtSh,OutlinerView * pOLV,ESelection aSelection,const String & rLangText,bool bIsForSelection,SfxItemSet & rCoreSet)246 void SetLanguage( SwWrtShell &rWrtSh, OutlinerView* pOLV, ESelection aSelection, const String &rLangText, bool bIsForSelection, SfxItemSet &rCoreSet ) 247 { 248 const LanguageType nLang = SvtLanguageTable().GetType( rLangText ); 249 if (nLang != LANGUAGE_DONTKNOW) 250 { 251 sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLang ); 252 253 EditEngine* pEditEngine = pOLV ? pOLV->GetEditView().GetEditEngine() : NULL; 254 DBG_ASSERT( !pOLV || pEditEngine, "OutlinerView without EditEngine???" ); 255 256 //get ScriptType 257 sal_uInt16 nLangWhichId = 0; 258 bool bIsSingleScriptType = true; 259 switch (nScriptType) 260 { 261 case SCRIPTTYPE_LATIN : nLangWhichId = pEditEngine ? EE_CHAR_LANGUAGE : RES_CHRATR_LANGUAGE; break; 262 case SCRIPTTYPE_ASIAN : nLangWhichId = pEditEngine ? EE_CHAR_LANGUAGE_CJK : RES_CHRATR_CJK_LANGUAGE; break; 263 case SCRIPTTYPE_COMPLEX : nLangWhichId = pEditEngine ? EE_CHAR_LANGUAGE_CTL : RES_CHRATR_CTL_LANGUAGE; break; 264 default: 265 bIsSingleScriptType = false; 266 DBG_ERROR( "unexpected case" ); 267 } 268 if (bIsSingleScriptType) 269 { 270 // change language for selection or paragraph 271 // (for paragraph is handled by previosuly having set the selection to the 272 // whole paragraph) 273 if (bIsForSelection) 274 { 275 // apply language to current selection 276 if (pEditEngine) 277 { 278 rCoreSet.Put( SvxLanguageItem( nLang, nLangWhichId )); 279 pEditEngine->QuickSetAttribs( rCoreSet, aSelection); 280 } 281 else 282 { 283 rWrtSh.GetCurAttr( rCoreSet ); 284 rCoreSet.Put( SvxLanguageItem( nLang, nLangWhichId )); 285 rWrtSh.SetAttrSet( rCoreSet ); 286 } 287 } 288 else // change language for all text 289 { 290 // set document default language 291 switch (nLangWhichId) 292 { 293 case EE_CHAR_LANGUAGE : nLangWhichId = RES_CHRATR_LANGUAGE; break; 294 case EE_CHAR_LANGUAGE_CJK : nLangWhichId = RES_CHRATR_CJK_LANGUAGE; break; 295 case EE_CHAR_LANGUAGE_CTL : nLangWhichId = RES_CHRATR_CTL_LANGUAGE; break; 296 } 297 rWrtSh.SetDefault( SvxLanguageItem( nLang, nLangWhichId ) ); 298 299 // #i102191: hard set respective language attribute in text document 300 // (for all text in the document - which should be selected by now...) 301 rWrtSh.SetAttrItem( SvxLanguageItem( nLang, nLangWhichId ) ); 302 } 303 } 304 } 305 } 306 SetLanguage_None(SwWrtShell & rWrtSh,bool bIsForSelection,SfxItemSet & rCoreSet)307 void SetLanguage_None( SwWrtShell &rWrtSh, bool bIsForSelection, SfxItemSet &rCoreSet ) 308 { 309 SetLanguage_None( rWrtSh,0,ESelection(),bIsForSelection,rCoreSet ); 310 } 311 SetLanguage_None(SwWrtShell & rWrtSh,OutlinerView * pOLV,ESelection aSelection,bool bIsForSelection,SfxItemSet & rCoreSet)312 void SetLanguage_None( SwWrtShell &rWrtSh, OutlinerView* pOLV, ESelection aSelection, bool bIsForSelection, SfxItemSet &rCoreSet ) 313 { 314 // EditEngine IDs 315 const sal_uInt16 aLangWhichId_EE[3] = 316 { 317 EE_CHAR_LANGUAGE, 318 EE_CHAR_LANGUAGE_CJK, 319 EE_CHAR_LANGUAGE_CTL 320 }; 321 322 // Writewr IDs 323 const sal_uInt16 aLangWhichId_Writer[3] = 324 { 325 RES_CHRATR_LANGUAGE, 326 RES_CHRATR_CJK_LANGUAGE, 327 RES_CHRATR_CTL_LANGUAGE 328 }; 329 330 if (bIsForSelection) 331 { 332 // change language for selection or paragraph 333 // (for paragraph is handled by previosuly having set the selection to the 334 // whole paragraph) 335 336 EditEngine* pEditEngine = pOLV ? pOLV->GetEditView().GetEditEngine() : NULL; 337 DBG_ASSERT( !pOLV || pEditEngine, "OutlinerView without EditEngine???" ); 338 if (pEditEngine) 339 { 340 for (sal_uInt16 i = 0; i < 3; ++i) 341 rCoreSet.Put( SvxLanguageItem( LANGUAGE_NONE, aLangWhichId_EE[i] )); 342 pEditEngine->QuickSetAttribs( rCoreSet, aSelection); 343 } 344 else 345 { 346 rWrtSh.GetCurAttr( rCoreSet ); 347 for (sal_uInt16 i = 0; i < 3; ++i) 348 rCoreSet.Put( SvxLanguageItem( LANGUAGE_NONE, aLangWhichId_Writer[i] )); 349 rWrtSh.SetAttrSet( rCoreSet ); 350 } 351 } 352 else // change language for all text 353 { 354 SvUShortsSort aAttribs; 355 for (sal_uInt16 i = 0; i < 3; ++i) 356 { 357 rWrtSh.SetDefault( SvxLanguageItem( LANGUAGE_NONE, aLangWhichId_Writer[i] ) ); 358 aAttribs.Insert( aLangWhichId_Writer[i] ); 359 } 360 361 // set all language attributes to default 362 // (for all text in the document - which should be selected by now...) 363 rWrtSh.ResetAttr( &aAttribs ); 364 } 365 } 366 ResetLanguages(SwWrtShell & rWrtSh,bool bIsForSelection)367 void ResetLanguages( SwWrtShell &rWrtSh, bool bIsForSelection ) 368 { 369 ResetLanguages( rWrtSh, 0 , ESelection(), bIsForSelection ); 370 } 371 ResetLanguages(SwWrtShell & rWrtSh,OutlinerView * pOLV,ESelection aSelection,bool bIsForSelection)372 void ResetLanguages( SwWrtShell &rWrtSh, OutlinerView* pOLV, ESelection aSelection, bool bIsForSelection ) 373 { 374 (void) bIsForSelection; 375 (void) aSelection; 376 377 // reset language for current selection. 378 // The selection should already have been expanded to the whole paragraph or 379 // to all text in the document if those are the ranges where to reset 380 // the language attributes 381 382 if (pOLV) 383 { 384 EditView &rEditView = pOLV->GetEditView(); 385 rEditView.RemoveAttribs( true, EE_CHAR_LANGUAGE ); 386 rEditView.RemoveAttribs( true, EE_CHAR_LANGUAGE_CJK ); 387 rEditView.RemoveAttribs( true, EE_CHAR_LANGUAGE_CTL ); 388 } 389 else 390 { 391 SvUShortsSort aAttribs; 392 aAttribs.Insert( RES_CHRATR_LANGUAGE ); 393 aAttribs.Insert( RES_CHRATR_CJK_LANGUAGE ); 394 aAttribs.Insert( RES_CHRATR_CTL_LANGUAGE ); 395 rWrtSh.ResetAttr( &aAttribs ); 396 } 397 } 398 399 400 /// @returns : the language for the selected text that is set for the 401 /// specified attribute (script type). 402 /// If there are more than one languages used LANGUAGE_DONTKNOW will be returned. 403 /// @param nLangWhichId : one of 404 /// RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE, GetLanguage(SwWrtShell & rSh,sal_uInt16 nLangWhichId)405 LanguageType GetLanguage( SwWrtShell &rSh, sal_uInt16 nLangWhichId ) 406 { 407 SfxItemSet aSet( rSh.GetAttrPool(), nLangWhichId, nLangWhichId ); 408 rSh.GetCurAttr( aSet ); 409 410 return GetLanguage(aSet,nLangWhichId); 411 } 412 GetLanguage(SfxItemSet aSet,sal_uInt16 nLangWhichId)413 LanguageType GetLanguage( SfxItemSet aSet, sal_uInt16 nLangWhichId ) 414 { 415 416 LanguageType nLang = LANGUAGE_SYSTEM; 417 418 const SfxPoolItem *pItem = 0; 419 SfxItemState nState = aSet.GetItemState( nLangWhichId, sal_True, &pItem ); 420 if (nState > SFX_ITEM_DEFAULT && pItem) 421 { 422 // the item is set and can be used 423 nLang = (dynamic_cast< const SvxLanguageItem* >(pItem))->GetLanguage(); 424 } 425 else if (nState == SFX_ITEM_DEFAULT) 426 { 427 // since the attribute is not set: retrieve the default value 428 nLang = (dynamic_cast< const SvxLanguageItem& >(aSet.GetPool()->GetDefaultItem( nLangWhichId ))).GetLanguage(); 429 } 430 else if (nState == SFX_ITEM_DONTCARE) 431 { 432 // there is more than one language... 433 nLang = LANGUAGE_DONTKNOW; 434 } 435 DBG_ASSERT( nLang != LANGUAGE_SYSTEM, "failed to get the language?" ); 436 437 return nLang; 438 } 439 440 /// @returns: the language in use for the selected text. 441 /// 'In use' means the language(s) matching the script type(s) of the 442 /// selected text. Or in other words, the language a spell checker would use. 443 /// If there is more than one language LANGUAGE_DONTKNOW will be returned. GetCurrentLanguage(SwWrtShell & rSh)444 LanguageType GetCurrentLanguage( SwWrtShell &rSh ) 445 { 446 // get all script types used in current selection 447 const sal_uInt16 nScriptType = rSh.GetScriptType(); 448 449 //set language attribute to use according to the script type 450 sal_uInt16 nLangWhichId = 0; 451 bool bIsSingleScriptType = true; 452 switch (nScriptType) 453 { 454 case SCRIPTTYPE_LATIN : nLangWhichId = RES_CHRATR_LANGUAGE; break; 455 case SCRIPTTYPE_ASIAN : nLangWhichId = RES_CHRATR_CJK_LANGUAGE; break; 456 case SCRIPTTYPE_COMPLEX : nLangWhichId = RES_CHRATR_CTL_LANGUAGE; break; 457 default: bIsSingleScriptType = false; break; 458 } 459 460 // get language according to the script type(s) in use 461 LanguageType nCurrentLang = LANGUAGE_SYSTEM; 462 if (bIsSingleScriptType) 463 nCurrentLang = GetLanguage( rSh, nLangWhichId ); 464 else 465 { 466 // check if all script types are set to LANGUAGE_NONE and return 467 // that if this is the case. Otherwise, having multiple script types 468 // in use always means there are several languages in use... 469 const sal_uInt16 aScriptTypes[3] = 470 { 471 RES_CHRATR_LANGUAGE, 472 RES_CHRATR_CJK_LANGUAGE, 473 RES_CHRATR_CTL_LANGUAGE 474 }; 475 nCurrentLang = LANGUAGE_NONE; 476 for (sal_uInt16 i = 0; i < 3; ++i) 477 { 478 LanguageType nTmpLang = GetLanguage( rSh, aScriptTypes[i] ); 479 if (nTmpLang != LANGUAGE_NONE) 480 { 481 nCurrentLang = LANGUAGE_DONTKNOW; 482 break; 483 } 484 } 485 } 486 DBG_ASSERT( nCurrentLang != LANGUAGE_SYSTEM, "failed to get the language?" ); 487 488 return nCurrentLang; 489 } 490 491 /// @returns: the language in use for the selected text. 492 /// 'In use' means the language(s) matching the script type(s) of the 493 /// selected text. Or in other words, the language a spell checker would use. 494 /// If there is more than one language LANGUAGE_DONTKNOW will be returned. GetCurrentLanguage(SfxItemSet aSet,sal_uInt16 nScriptType)495 LanguageType GetCurrentLanguage( SfxItemSet aSet, sal_uInt16 nScriptType ) 496 { 497 //set language attribute to use according to the script type 498 sal_uInt16 nLangWhichId = 0; 499 bool bIsSingleScriptType = true; 500 switch (nScriptType) 501 { 502 case SCRIPTTYPE_LATIN : nLangWhichId = EE_CHAR_LANGUAGE; break; 503 case SCRIPTTYPE_ASIAN : nLangWhichId = EE_CHAR_LANGUAGE_CJK; break; 504 case SCRIPTTYPE_COMPLEX : nLangWhichId = EE_CHAR_LANGUAGE_CTL; break; 505 default: bIsSingleScriptType = false; 506 } 507 508 // get language according to the script type(s) in use 509 LanguageType nCurrentLang = LANGUAGE_SYSTEM; 510 if (bIsSingleScriptType) 511 nCurrentLang = GetLanguage( aSet, nLangWhichId ); 512 else 513 { 514 // check if all script types are set to LANGUAGE_NONE and return 515 // that if this is the case. Otherwise, having multiple script types 516 // in use always means there are several languages in use... 517 const sal_uInt16 aScriptTypes[3] = 518 { 519 EE_CHAR_LANGUAGE, 520 EE_CHAR_LANGUAGE_CJK, 521 EE_CHAR_LANGUAGE_CTL 522 }; 523 nCurrentLang = LANGUAGE_NONE; 524 for (sal_uInt16 i = 0; i < 3; ++i) 525 { 526 LanguageType nTmpLang = GetLanguage( aSet, aScriptTypes[i] ); 527 if (nTmpLang != LANGUAGE_NONE) 528 { 529 nCurrentLang = LANGUAGE_DONTKNOW; 530 break; 531 } 532 } 533 } 534 DBG_ASSERT( nCurrentLang != LANGUAGE_SYSTEM, "failed to get the language?" ); 535 536 return nCurrentLang; 537 } 538 GetTextForLanguageGuessing(SwWrtShell & rSh)539 String GetTextForLanguageGuessing( SwWrtShell &rSh ) 540 { 541 // string for guessing language 542 String aText; 543 SwPaM *pCrsr = rSh.GetCrsr(); 544 SwTxtNode *pNode = pCrsr->GetNode()->GetTxtNode(); 545 if (pNode) 546 { 547 aText = pNode->GetTxt(); 548 if (aText.Len() > 0) 549 { 550 xub_StrLen nStt = 0; 551 xub_StrLen nEnd = pCrsr->GetPoint()->nContent.GetIndex(); 552 // at most 100 chars to the left... 553 nStt = nEnd > 100 ? nEnd - 100 : 0; 554 // ... and 100 to the right of the cursor position 555 nEnd = aText.Len() - nEnd > 100 ? nEnd + 100 : aText.Len(); 556 aText = aText.Copy( nStt, nEnd - nStt ); 557 } 558 } 559 return aText; 560 } 561 GetTextForLanguageGuessing(EditEngine * rEditEngine,ESelection aDocSelection)562 String GetTextForLanguageGuessing( EditEngine* rEditEngine, ESelection aDocSelection ) 563 { 564 // string for guessing language 565 String aText; 566 567 aText = rEditEngine->GetText(aDocSelection); 568 if (aText.Len() > 0) 569 { 570 xub_StrLen nStt = 0; 571 xub_StrLen nEnd = aDocSelection.nEndPos; 572 // at most 100 chars to the left... 573 nStt = nEnd > 100 ? nEnd - 100 : 0; 574 // ... and 100 to the right of the cursor position 575 nEnd = aText.Len() - nEnd > 100 ? nEnd + 100 : aText.Len(); 576 aText = aText.Copy( nStt, nEnd - nStt ); 577 } 578 579 return aText; 580 } 581 582 SelectPara(EditView & rEditView,const ESelection & rCurSel)583 void SelectPara( EditView &rEditView, const ESelection &rCurSel ) 584 { 585 ESelection aParaSel( rCurSel.nStartPara, 0, rCurSel.nStartPara, USHRT_MAX ); 586 rEditView.SetSelection( aParaSel ); 587 } 588 SelectCurrentPara(SwWrtShell & rWrtSh)589 void SelectCurrentPara( SwWrtShell &rWrtSh ) 590 { 591 // select current para 592 if (!rWrtSh.IsSttPara()) 593 rWrtSh.MovePara( fnParaCurr, fnParaStart ); 594 if (!rWrtSh.HasMark()) 595 rWrtSh.SetMark(); 596 rWrtSh.SwapPam(); 597 if (!rWrtSh.IsEndPara()) 598 rWrtSh.MovePara( fnParaCurr, fnParaEnd ); 599 #if OSL_DEBUG_LEVEL > 1 600 String aSelTxt; 601 rWrtSh.GetSelectedText( aSelTxt ); 602 (void) aSelTxt; 603 #endif 604 } 605 } 606 607