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_cui.hxx" 26 27 #include "hyphen.hxx" 28 #include "hyphen.hrc" 29 #include "cuires.hrc" 30 #include "dialmgr.hxx" 31 32 #include <editeng/splwrap.hxx> 33 #include <editeng/svxenum.hxx> 34 #include <editeng/unolingu.hxx> 35 #include <svtools/langtab.hxx> 36 #include <svx/dialmgr.hxx> 37 #include <svx/dlgutil.hxx> 38 #include <tools/list.hxx> 39 #include <tools/shl.hxx> 40 #include <vcl/msgbox.hxx> 41 42 #include <com/sun/star/linguistic2/XPossibleHyphens.hpp> 43 44 using namespace ::com::sun::star; 45 46 47 #define HYPH_POS_CHAR '=' 48 #define CONTINUE_HYPH USHRT_MAX 49 50 #define CUR_HYPH_POS_CHAR '-' 51 52 53 // class HyphenEdit_Impl ------------------------------------------------------- 54 55 class HyphenEdit_Impl : public Edit 56 { 57 public: 58 HyphenEdit_Impl( Window* pParent, const ResId& rResId ); 59 60 protected: 61 virtual void KeyInput( const KeyEvent &rKEvt ); 62 }; 63 64 65 HyphenEdit_Impl::HyphenEdit_Impl( Window* pParent, const ResId& rResId ) : 66 Edit( pParent, rResId ) 67 { 68 } 69 70 71 void HyphenEdit_Impl::KeyInput( const KeyEvent& rKEvt ) 72 { 73 // sal_uInt16 nMod = rKEvt.GetKeyCode().GetModifier(); 74 sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); 75 76 switch ( nCode ) 77 { 78 case KEY_LEFT: 79 ( (SvxHyphenWordDialog*)GetParent() )->SelLeft(); 80 break; 81 82 case KEY_RIGHT: 83 ( (SvxHyphenWordDialog*)GetParent() )->SelRight(); 84 break; 85 86 case KEY_TAB: 87 case KEY_ESCAPE: 88 case KEY_RETURN: 89 Edit::KeyInput(rKEvt); 90 break; 91 default: 92 Control::KeyInput( rKEvt ); // An den Dialog weiterleiten 93 break; 94 } 95 } 96 97 98 // struct SvxHyphenWordDialog_Impl --------------------------------------------- 99 100 struct SvxHyphenWordDialog_Impl 101 { 102 SvxHyphenWordDialog * m_pDialog; 103 // Window * m_pParent; 104 105 FixedText aWordFT; 106 HyphenEdit_Impl aWordEdit; 107 ImageButton aLeftBtn; 108 ImageButton aRightBtn; 109 OKButton aOkBtn; 110 PushButton aContBtn; 111 PushButton aDelBtn; 112 FixedLine aFLBottom; 113 HelpButton aHelpBtn; 114 PushButton aHyphAll; 115 CancelButton aCancelBtn; 116 String aLabel; 117 SvxSpellWrapper* pHyphWrapper; 118 uno::Reference< linguistic2::XHyphenator > xHyphenator; 119 uno::Reference< linguistic2::XPossibleHyphens > xPossHyph; 120 String aEditWord; // aEditWord and aWordEdit.GetText() differ only by the character for the current selected hyphenation position 121 String aActWord; // actual word to be hyphenated 122 LanguageType nActLanguage; // and its language 123 sal_uInt16 nMaxHyphenationPos; // right most valid hyphenation pos 124 sal_uInt16 nHyphPos; 125 sal_uInt16 nOldPos; 126 sal_Int32 nHyphenationPositionsOffset; 127 sal_Bool bBusy; 128 129 130 void EnableLRBtn_Impl(); 131 String EraseUnusableHyphens_Impl( ::com::sun::star::uno::Reference< ::com::sun::star::linguistic2::XPossibleHyphens > &rxPossHyph, sal_uInt16 nMaxHyphenationPos ); 132 133 void InitControls_Impl(); 134 void ContinueHyph_Impl( sal_uInt16 nInsPos = 0 ); 135 sal_uInt16 GetHyphIndex_Impl(); 136 void SelLeft_Impl(); 137 void SelRight_Impl(); 138 139 DECL_LINK( Left_Impl, Button* ); 140 DECL_LINK( Right_Impl, Button* ); 141 DECL_LINK( CutHdl_Impl, Button* ); 142 DECL_LINK( ContinueHdl_Impl, Button* ); 143 DECL_LINK( DeleteHdl_Impl, Button* ); 144 DECL_LINK( HyphenateAllHdl_Impl, Button* ); 145 DECL_LINK( CancelHdl_Impl, Button* ); 146 DECL_LINK( GetFocusHdl_Impl, Edit* ); 147 148 149 SvxHyphenWordDialog_Impl( 150 SvxHyphenWordDialog * pDialog, 151 const String &rWord, 152 LanguageType nLang, 153 uno::Reference< linguistic2::XHyphenator > &xHyphen, 154 SvxSpellWrapper* pWrapper ); 155 ~SvxHyphenWordDialog_Impl(); 156 }; 157 158 159 SvxHyphenWordDialog_Impl::SvxHyphenWordDialog_Impl( 160 SvxHyphenWordDialog * pDialog, 161 const String &rWord, 162 LanguageType nLang, 163 uno::Reference< linguistic2::XHyphenator > &xHyphen, 164 SvxSpellWrapper* pWrapper ) : 165 166 m_pDialog ( pDialog ), 167 aWordFT ( pDialog, CUI_RES( FT_WORD ) ), 168 aWordEdit ( pDialog, CUI_RES( ED_WORD ) ), 169 aLeftBtn ( pDialog, CUI_RES( BTN_LEFT ) ), 170 aRightBtn ( pDialog, CUI_RES( BTN_RIGHT ) ), 171 aOkBtn ( pDialog, CUI_RES( BTN_HYPH_CUT ) ), 172 aContBtn ( pDialog, CUI_RES( BTN_HYPH_CONTINUE ) ), 173 aDelBtn ( pDialog, CUI_RES( BTN_HYPH_DELETE ) ), 174 aFLBottom ( pDialog, CUI_RES( FL_BOTTOM ) ), 175 aHelpBtn ( pDialog, CUI_RES( BTN_HYPH_HELP ) ), 176 aHyphAll ( pDialog, CUI_RES( BTN_HYPH_ALL ) ), 177 aCancelBtn ( pDialog, CUI_RES( BTN_HYPH_CANCEL ) ), 178 aLabel ( pDialog->GetText() ), 179 pHyphWrapper ( NULL ), 180 xHyphenator ( NULL ), 181 xPossHyph ( NULL ), 182 aActWord ( ), 183 nActLanguage ( LANGUAGE_NONE ), 184 nMaxHyphenationPos ( 0 ), 185 nHyphPos ( 0 ), 186 nOldPos ( 0 ), 187 nHyphenationPositionsOffset( 0 ), 188 bBusy ( sal_False ) 189 { 190 aActWord = rWord; 191 nActLanguage = nLang; 192 xHyphenator = xHyphen; 193 pHyphWrapper = pWrapper; 194 195 uno::Reference< linguistic2::XHyphenatedWord > xHyphWord( pHyphWrapper ? 196 pHyphWrapper->GetLast() : NULL, uno::UNO_QUERY ); 197 DBG_ASSERT( xHyphWord.is(), "hyphenation result missing" ); 198 if (xHyphWord.is()) 199 { 200 DBG_ASSERT( aActWord == String( xHyphWord->getWord() ), "word mismatch" ); 201 DBG_ASSERT( nActLanguage == SvxLocaleToLanguage( xHyphWord->getLocale() ), "language mismatch" ); 202 nMaxHyphenationPos = xHyphWord->getHyphenationPos(); 203 } 204 205 InitControls_Impl(); 206 aWordEdit.GrabFocus(); 207 208 aLeftBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, Left_Impl ) ); 209 aRightBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, Right_Impl ) ); 210 aOkBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, CutHdl_Impl ) ); 211 aContBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, ContinueHdl_Impl ) ); 212 aDelBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, DeleteHdl_Impl ) ); 213 aHyphAll.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, HyphenateAllHdl_Impl ) ); 214 aCancelBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, CancelHdl_Impl ) ); 215 aWordEdit.SetGetFocusHdl( LINK( this, SvxHyphenWordDialog_Impl, GetFocusHdl_Impl ) ); 216 } 217 218 219 SvxHyphenWordDialog_Impl::~SvxHyphenWordDialog_Impl() 220 { 221 } 222 223 224 void SvxHyphenWordDialog_Impl::EnableLRBtn_Impl() 225 { 226 String aTxt( aEditWord ); 227 xub_StrLen nLen = aTxt.Len(); 228 xub_StrLen i; 229 230 aRightBtn.Disable(); 231 for ( i = nOldPos + 2; i < nLen; ++i ) 232 { 233 if ( aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR ) ) 234 { 235 aRightBtn.Enable(); 236 break; 237 } 238 } 239 240 DBG_ASSERT(nOldPos < aTxt.Len(), "nOldPos out of range"); 241 if (nOldPos >= aTxt.Len()) 242 nOldPos = aTxt.Len() - 1; 243 aLeftBtn.Disable(); 244 for ( i = nOldPos; i-- > 0; ) 245 { 246 if ( aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR ) ) 247 { 248 aLeftBtn.Enable(); 249 break; 250 } 251 } 252 } 253 254 255 String SvxHyphenWordDialog_Impl::EraseUnusableHyphens_Impl( 256 uno::Reference< linguistic2::XPossibleHyphens > &rxPossHyph, 257 sal_uInt16 _nMaxHyphenationPos ) 258 { 259 // returns a String showing only those hyphen positions which will result 260 // in a line break if hyphenation is done there 261 // 1) we will need to discard all hyphenation positions at th end that 262 // will not result in a line break where the text to the left still fits 263 // on the line. 264 // 2) since as from OOo 3.2 '-' are part of a word an thus text like 265 // 'multi-line-editor' is regarded as single word we also need to discard those 266 // hyphenation positions to the left of the rightmost '-' that is still left of 267 // the rightmost valid hyphenation position according to 1) 268 // 269 // Example: 270 // If the possible hyphenation position in 'multi-line-editor' are to eb marked 271 // by '=' then the text will look like this 'mul=ti-line-ed=it=or'. 272 // If now the first line is only large enough for 'multi-line-edi' we need to discard 273 // the last possible hyphnation point because of 1). The the right most valid 274 // hyphenation position is "ed=itor". The first '-' left of this position is 275 // "line-ed", thus because of 2) we now need to discard all possible hyphneation 276 // positions to the left of that as well. Thus in the end leaving us with just 277 // 'multi-line-ed=itor' as return value for this function. (Just one valid hyphenation 278 // position for the user too choose from. However ALL the '-' characters in the word 279 // will ALWAYS be valid implicit hyphenation positions for the core to choose from! 280 // And thus even if this word is skipped in the hyphenation dialog it will still be broken 281 // right after 'multi-line-' (actually it might already be broken up that way before 282 // the hyphenation dialog is called!). 283 // Thus rule 2) just eliminates those positions which will not be used by the core at all 284 // even if the user were to select one of them. 285 286 String aTxt; 287 DBG_ASSERT(rxPossHyph.is(), "missing possible hyphens"); 288 if (rxPossHyph.is()) 289 { 290 DBG_ASSERT( aActWord == String( rxPossHyph->getWord() ), "word mismatch" ); 291 292 aTxt = String( rxPossHyph->getPossibleHyphens() ); 293 294 nHyphenationPositionsOffset = 0; 295 uno::Sequence< sal_Int16 > aHyphenationPositions( 296 rxPossHyph->getHyphenationPositions() ); 297 sal_Int32 nLen = aHyphenationPositions.getLength(); 298 const sal_Int16 *pHyphenationPos = aHyphenationPositions.getConstArray(); 299 300 // find position nIdx after which all hyphen positions are unusable 301 xub_StrLen nIdx = STRING_NOTFOUND; 302 xub_StrLen nPos = 0, nPos1 = 0, nPos2 = 0; 303 if (nLen) 304 { 305 xub_StrLen nStart = 0; 306 for (sal_Int32 i = 0; i < nLen; ++i) 307 { 308 if (pHyphenationPos[i] > _nMaxHyphenationPos) 309 break; 310 else 311 { 312 // find corresponding hyphen pos in string 313 nPos = aTxt.Search( sal_Unicode( HYPH_POS_CHAR ), nStart ); 314 315 if (nStart == STRING_NOTFOUND) 316 break; 317 else 318 { 319 nIdx = nPos; 320 nStart = nPos + 1; 321 } 322 } 323 } 324 } 325 DBG_ASSERT(nIdx != STRING_NOTFOUND, "no usable hyphenation position"); 326 327 // 1) remove all not usable hyphenation positions from the end of the string 328 nPos = nIdx == STRING_NOTFOUND ? 0 : nIdx + 1; 329 nPos1 = nPos; //save for later use in 2) below 330 const String aTmp( sal_Unicode( HYPH_POS_CHAR ) ); 331 const String aEmpty; 332 while (nPos != STRING_NOTFOUND) 333 nPos = aTxt.SearchAndReplace( aTmp, aEmpty, nPos + 1 ); 334 335 // 2) remove all hyphenation positions from the start that are not considered by the core 336 const String aSearchRange( aTxt.Copy( 0, nPos1 ) ); 337 nPos2 = aSearchRange.SearchBackward( '-' ); // the '-' position the core will use by default 338 if (nPos2 != STRING_NOTFOUND) 339 { 340 String aLeft( aSearchRange.Copy( 0, nPos2 ) ); 341 nPos = 0; 342 while (nPos != STRING_NOTFOUND) 343 { 344 nPos = aLeft.SearchAndReplace( aTmp, aEmpty, nPos + 1 ); 345 if (nPos != STRING_NOTFOUND) 346 ++nHyphenationPositionsOffset; 347 } 348 aTxt.Replace( 0, nPos2, aLeft ); 349 } 350 } 351 return aTxt; 352 } 353 354 355 void SvxHyphenWordDialog_Impl::InitControls_Impl() 356 { 357 xPossHyph = NULL; 358 if (xHyphenator.is()) 359 { 360 lang::Locale aLocale( SvxCreateLocale(nActLanguage) ); 361 xPossHyph = xHyphenator->createPossibleHyphens( aActWord, aLocale, 362 uno::Sequence< beans::PropertyValue >() ); 363 if (xPossHyph.is()) 364 aEditWord = EraseUnusableHyphens_Impl( xPossHyph, nMaxHyphenationPos ); 365 } 366 aWordEdit.SetText( aEditWord ); 367 368 nOldPos = aEditWord.Len(); 369 SelLeft_Impl(); 370 EnableLRBtn_Impl(); 371 } 372 373 374 void SvxHyphenWordDialog_Impl::ContinueHyph_Impl( sal_uInt16 nInsPos ) 375 { 376 if ( nInsPos != CONTINUE_HYPH && xPossHyph.is()) 377 { 378 if (nInsPos) 379 { 380 String aTmp( aEditWord ); 381 DBG_ASSERT(nInsPos <= aTmp.Len() - 2, "wrong hyphen position"); 382 383 sal_Int16 nIdxPos = -1; 384 for (sal_uInt16 i = 0; i <= nInsPos; ++i) 385 { 386 if (HYPH_POS_CHAR == aTmp.GetChar( i )) 387 nIdxPos++; 388 } 389 // take the possible hyphenation positions that got removed from the 390 // start of the wor dinot account: 391 nIdxPos += nHyphenationPositionsOffset; 392 393 uno::Sequence< sal_Int16 > aSeq = xPossHyph->getHyphenationPositions(); 394 sal_Int32 nLen = aSeq.getLength(); 395 DBG_ASSERT(nLen, "empty sequence"); 396 DBG_ASSERT(0 <= nIdxPos && nIdxPos < nLen, "index out of range"); 397 if (nLen && 0 <= nIdxPos && nIdxPos < nLen) 398 { 399 nInsPos = aSeq.getConstArray()[ nIdxPos ]; 400 pHyphWrapper->InsertHyphen( nInsPos ); 401 } 402 } 403 else 404 { 405 //! calling with 0 as argument will remove hyphens! 406 pHyphWrapper->InsertHyphen( nInsPos ); 407 } 408 } 409 410 if ( pHyphWrapper->FindSpellError() ) 411 { 412 uno::Reference< linguistic2::XHyphenatedWord > xHyphWord( pHyphWrapper->GetLast(), uno::UNO_QUERY ); 413 414 // adapt actual word and language to new found hyphenation result 415 if(xHyphWord.is()) 416 { 417 aActWord = String( xHyphWord->getWord() ); 418 nActLanguage = SvxLocaleToLanguage( xHyphWord->getLocale() ); 419 nMaxHyphenationPos = xHyphWord->getHyphenationPos(); 420 InitControls_Impl(); 421 m_pDialog->SetWindowTitle( nActLanguage ); 422 } 423 } 424 else 425 m_pDialog->EndDialog( RET_OK ); 426 } 427 428 429 sal_uInt16 SvxHyphenWordDialog_Impl::GetHyphIndex_Impl() 430 { 431 sal_uInt16 nPos = 0; 432 String aTxt( aWordEdit.GetText() ); 433 434 for ( sal_uInt16 i=0 ; i < aTxt.Len(); ++i ) 435 { 436 sal_Unicode cChar = aTxt.GetChar( i ); 437 if ( cChar == CUR_HYPH_POS_CHAR ) 438 break; 439 if ( cChar != HYPH_POS_CHAR ) 440 nPos++; 441 } 442 return nPos; 443 } 444 445 446 void SvxHyphenWordDialog_Impl::SelLeft_Impl() 447 { 448 DBG_ASSERT( nOldPos > 0, "invalid hyphenation position" ); 449 if (nOldPos > 0) 450 { 451 String aTxt( aEditWord ); 452 for ( xub_StrLen i = nOldPos - 1; i > 0; --i) 453 { 454 DBG_ASSERT(i <= aTxt.Len(), "index out of range"); 455 if (aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR )) 456 { 457 aTxt.SetChar( i, sal_Unicode( CUR_HYPH_POS_CHAR ) ); 458 459 nOldPos = i; 460 aWordEdit.SetText( aTxt ); 461 aWordEdit.GrabFocus(); 462 aWordEdit.SetSelection( Selection( i, i + 1 ) ); 463 break; 464 } 465 } 466 nHyphPos = GetHyphIndex_Impl(); 467 EnableLRBtn_Impl(); 468 } 469 } 470 471 472 void SvxHyphenWordDialog_Impl::SelRight_Impl() 473 { 474 String aTxt( aEditWord ); 475 for ( xub_StrLen i = nOldPos + 1; i < aTxt.Len(); ++i ) 476 { 477 if (aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR )) 478 { 479 aTxt.SetChar( i, sal_Unicode( CUR_HYPH_POS_CHAR ) ); 480 481 nOldPos = i; 482 aWordEdit.SetText( aTxt ); 483 aWordEdit.GrabFocus(); 484 aWordEdit.SetSelection( Selection( i, i + 1 ) ); 485 break; 486 } 487 } 488 nHyphPos = GetHyphIndex_Impl(); 489 EnableLRBtn_Impl(); 490 } 491 492 493 IMPL_LINK( SvxHyphenWordDialog_Impl, CutHdl_Impl, Button *, EMPTYARG ) 494 { 495 if( !bBusy ) 496 { 497 bBusy = sal_True; 498 ContinueHyph_Impl( /*nHyphPos*/nOldPos ); 499 bBusy = sal_False; 500 } 501 return 0; 502 } 503 504 505 IMPL_LINK( SvxHyphenWordDialog_Impl, HyphenateAllHdl_Impl, Button *, EMPTYARG /*pButton*/ ) 506 { 507 if( !bBusy ) 508 { 509 try 510 { 511 uno::Reference< beans::XPropertySet > xProp( SvxGetLinguPropertySet() ); 512 const rtl::OUString aName( rtl::OUString::createFromAscii( "IsHyphAuto" ) ); 513 uno::Any aAny; 514 515 aAny <<= sal_True; 516 xProp->setPropertyValue( aName, aAny ); 517 518 bBusy = sal_True; 519 ContinueHyph_Impl( /*nHyphPos*/nOldPos ); 520 bBusy = sal_False; 521 522 aAny <<= sal_False; 523 xProp->setPropertyValue( aName, aAny ); 524 } 525 catch (uno::Exception &e) 526 { 527 (void) e; 528 DBG_ASSERT( 0, "Hyphenate All failed" ); 529 } 530 } 531 return 0; 532 } 533 534 535 IMPL_LINK( SvxHyphenWordDialog_Impl, DeleteHdl_Impl, Button *, EMPTYARG ) 536 { 537 if( !bBusy ) 538 { 539 bBusy = sal_True; 540 ContinueHyph_Impl(); 541 bBusy = sal_False; 542 } 543 return 0; 544 } 545 546 547 IMPL_LINK( SvxHyphenWordDialog_Impl, ContinueHdl_Impl, Button *, EMPTYARG ) 548 { 549 if( !bBusy ) 550 { 551 bBusy = sal_True; 552 ContinueHyph_Impl( CONTINUE_HYPH ); 553 bBusy = sal_False; 554 } 555 return 0; 556 } 557 558 559 IMPL_LINK( SvxHyphenWordDialog_Impl, CancelHdl_Impl, Button *, EMPTYARG ) 560 { 561 if( !bBusy ) 562 { 563 bBusy = sal_True; 564 pHyphWrapper->SpellEnd(); 565 m_pDialog->EndDialog( RET_CANCEL ); 566 bBusy = sal_False; 567 } 568 return 0; 569 } 570 571 572 IMPL_LINK( SvxHyphenWordDialog_Impl, Left_Impl, Button *, EMPTYARG ) 573 { 574 if( !bBusy ) 575 { 576 bBusy = sal_True; 577 SelLeft_Impl(); 578 bBusy = sal_False; 579 } 580 return 0; 581 } 582 583 584 IMPL_LINK( SvxHyphenWordDialog_Impl, Right_Impl, Button *, EMPTYARG ) 585 { 586 if( !bBusy ) 587 { 588 bBusy = sal_True; 589 SelRight_Impl(); 590 bBusy = sal_False; 591 } 592 return 0; 593 } 594 595 596 IMPL_LINK( SvxHyphenWordDialog_Impl, GetFocusHdl_Impl, Edit *, EMPTYARG ) 597 { 598 aWordEdit.SetSelection( Selection( nOldPos, nOldPos + 1 ) ); 599 return 0; 600 } 601 602 603 // class SvxHyphenWordDialog --------------------------------------------- 604 605 SvxHyphenWordDialog::SvxHyphenWordDialog( 606 const String &rWord, LanguageType nLang, 607 Window* pParent, 608 uno::Reference< linguistic2::XHyphenator > &xHyphen, 609 SvxSpellWrapper* pWrapper ) : 610 611 SfxModalDialog( pParent, CUI_RES( RID_SVXDLG_HYPHENATE ) ) 612 { 613 m_pImpl = std::auto_ptr< SvxHyphenWordDialog_Impl >( 614 new SvxHyphenWordDialog_Impl( this, rWord, nLang, xHyphen, pWrapper ) ); 615 616 FreeResource(); 617 618 SetWindowTitle( nLang ); 619 620 // disable controls if service is not available 621 if (!m_pImpl->xHyphenator.is()) 622 Enable( sal_False ); 623 } 624 625 626 SvxHyphenWordDialog::~SvxHyphenWordDialog() 627 { 628 } 629 630 631 void SvxHyphenWordDialog::SetWindowTitle( LanguageType nLang ) 632 { 633 String aLangStr( SvtLanguageTable::GetLanguageString( nLang ) ); 634 String aTmp( m_pImpl->aLabel ); 635 aTmp.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) ); 636 aTmp.Append( aLangStr ); 637 aTmp.Append( sal_Unicode( ')' ) ); 638 SetText( aTmp ); 639 } 640 641 642 void SvxHyphenWordDialog::SelLeft() 643 { 644 m_pImpl->SelRight_Impl(); 645 } 646 647 648 void SvxHyphenWordDialog::SelRight() 649 { 650 m_pImpl->SelLeft_Impl(); 651 } 652 653 654