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_formula.hxx" 26 27 //---------------------------------------------------------------------------- 28 #include <vcl/sound.hxx> 29 #include <vcl/svapp.hxx> 30 #include <vcl/scrbar.hxx> 31 32 #include "formula/funcutl.hxx" 33 #include "formula/IControlReferenceHandler.hxx" 34 #include "ControlHelper.hxx" 35 #include "ModuleHelper.hxx" 36 #include "ForResId.hrc" 37 38 39 namespace formula 40 { 41 //============================================================================ 42 // class ValWnd 43 //---------------------------------------------------------------------------- 44 45 ValWnd::ValWnd( Window* pParent, const ResId& rId ) : Window( pParent, rId ) 46 { 47 Font aFnt( GetFont() ); 48 aFnt.SetTransparent( sal_True ); 49 aFnt.SetWeight( WEIGHT_LIGHT ); 50 if ( pParent->IsBackground() ) 51 { 52 Wallpaper aBack = pParent->GetBackground(); 53 SetFillColor( aBack.GetColor() ); 54 SetBackground( aBack ); 55 aFnt.SetFillColor( aBack.GetColor() ); 56 } 57 else 58 { 59 SetFillColor(); 60 SetBackground(); 61 } 62 SetFont( aFnt ); 63 SetLineColor(); 64 65 Size aSzWnd = GetOutputSizePixel(); 66 long nHeight = GetTextHeight(); 67 long nDiff = aSzWnd.Height()-nHeight; 68 69 aRectOut = Rectangle( Point( 1, ( nDiff<2 ) ? 1 : nDiff/2), 70 Size ( aSzWnd.Width()-2, nHeight ) ); 71 SetClipRegion( Region( aRectOut ) ); 72 } 73 74 //---------------------------------------------------------------------------- 75 76 void __EXPORT ValWnd::Paint( const Rectangle& ) 77 { 78 DrawText( aRectOut.TopLeft(), aStrValue ); 79 } 80 81 //---------------------------------------------------------------------------- 82 83 void ValWnd::SetValue( const String& rStrVal ) 84 { 85 if ( aStrValue != rStrVal ) 86 { 87 aStrValue = rStrVal; 88 DrawRect( aRectOut ); // alten Text loeschen 89 Paint( aRectOut ); // und neu malen 90 } 91 } 92 93 //============================================================================ 94 // class ArgEdit 95 //---------------------------------------------------------------------------- 96 97 ArgEdit::ArgEdit( Window* pParent, const ResId& rResId ) 98 : RefEdit( pParent, rResId ), 99 pEdPrev ( NULL ), 100 pEdNext ( NULL ), 101 pSlider ( NULL ), 102 nArgs ( 0 ) 103 { 104 } 105 106 //---------------------------------------------------------------------------- 107 108 void ArgEdit::Init( ArgEdit* pPrevEdit, ArgEdit* pNextEdit, 109 ScrollBar& rArgSlider, sal_uInt16 nArgCount ) 110 { 111 pEdPrev = pPrevEdit; 112 pEdNext = pNextEdit; 113 pSlider = &rArgSlider; 114 nArgs = nArgCount; 115 } 116 117 //---------------------------------------------------------------------------- 118 119 // Cursorsteuerung fuer EditFelder im Argument-Dialog 120 121 void __EXPORT ArgEdit::KeyInput( const KeyEvent& rKEvt ) 122 { 123 KeyCode aCode = rKEvt.GetKeyCode(); 124 sal_Bool bUp = (aCode.GetCode() == KEY_UP); 125 sal_Bool bDown = (aCode.GetCode() == KEY_DOWN); 126 ArgEdit* pEd = NULL; 127 128 if ( pSlider 129 && ( !aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() ) 130 && ( bUp || bDown ) ) 131 { 132 if ( nArgs > 1 ) 133 { 134 long nThumb = pSlider->GetThumbPos(); 135 sal_Bool bDoScroll = sal_False; 136 sal_Bool bChangeFocus = sal_False; 137 138 if ( bDown ) 139 { 140 if ( nArgs > 4 ) 141 { 142 if ( !pEdNext ) 143 { 144 nThumb++; 145 bDoScroll = ( nThumb+3 < (long)nArgs ); 146 } 147 else 148 { 149 pEd = pEdNext; 150 bChangeFocus = sal_True; 151 } 152 } 153 else if ( pEdNext ) 154 { 155 pEd = pEdNext; 156 bChangeFocus = sal_True; 157 } 158 } 159 else // if ( bUp ) 160 { 161 if ( nArgs > 4 ) 162 { 163 if ( !pEdPrev ) 164 { 165 nThumb--; 166 bDoScroll = ( nThumb >= 0 ); 167 } 168 else 169 { 170 pEd = pEdPrev; 171 bChangeFocus = sal_True; 172 } 173 } 174 else if ( pEdPrev ) 175 { 176 pEd = pEdPrev; 177 bChangeFocus = sal_True; 178 } 179 } 180 181 if ( bDoScroll ) 182 { 183 pSlider->SetThumbPos( nThumb ); 184 ((Link&)pSlider->GetEndScrollHdl()).Call( pSlider ); 185 } 186 else if ( bChangeFocus ) 187 { 188 pEd->GrabFocus(); 189 } 190 else 191 Sound::Beep(); 192 } 193 else 194 Sound::Beep(); 195 } 196 else 197 RefEdit::KeyInput( rKEvt ); 198 } 199 200 201 202 203 /************************************************************************* 204 #* Member: ArgInput Datum:13.01.97 205 #*------------------------------------------------------------------------ 206 #* 207 #* Klasse: ArgInput 208 #* 209 #* Funktion: Konstruktor der Klasse ArgInput 210 #* 211 #* Input: --- 212 #* 213 #* Output: --- 214 #* 215 #************************************************************************/ 216 217 ArgInput::ArgInput() 218 { 219 pFtArg=NULL; 220 pBtnFx=NULL; 221 pEdArg=NULL; 222 pRefBtn=NULL; 223 } 224 225 /************************************************************************* 226 #* Member: InitArgInput Datum:13.01.97 227 #*------------------------------------------------------------------------ 228 #* 229 #* Klasse: ArgInput 230 #* 231 #* Funktion: Initialisiert die Pointer der Klasse 232 #* 233 #* Input: --- 234 #* 235 #* Output: --- 236 #* 237 #************************************************************************/ 238 239 void ArgInput::InitArgInput(FixedText* pftArg, 240 ImageButton* pbtnFx, 241 ArgEdit* pedArg, 242 RefButton* prefBtn) 243 { 244 pFtArg =pftArg; 245 pBtnFx =pbtnFx; 246 pEdArg =pedArg; 247 pRefBtn=prefBtn; 248 249 if(pBtnFx!=NULL) 250 { 251 pBtnFx->SetClickHdl ( LINK( this, ArgInput, FxBtnClickHdl ) ); 252 pBtnFx->SetGetFocusHdl( LINK( this, ArgInput, FxBtnFocusHdl ) ); 253 } 254 if(pRefBtn!=NULL) 255 { 256 pRefBtn->SetClickHdl ( LINK( this, ArgInput, RefBtnClickHdl ) ); 257 pRefBtn->SetGetFocusHdl( LINK( this, ArgInput, RefBtnFocusHdl ) ); 258 } 259 if(pEdArg!=NULL) 260 { 261 pEdArg->SetGetFocusHdl ( LINK( this, ArgInput, EdFocusHdl ) ); 262 pEdArg->SetModifyHdl ( LINK( this, ArgInput, EdModifyHdl ) ); 263 } 264 265 } 266 267 /************************************************************************* 268 #* Member: SetArgName Datum:13.01.97 269 #*------------------------------------------------------------------------ 270 #* 271 #* Klasse: ArgInput 272 #* 273 #* Funktion: Setzt den Namen fuer das Argument 274 #* 275 #* Input: String 276 #* 277 #* Output: --- 278 #* 279 #************************************************************************/ 280 void ArgInput::SetArgName(const String &aArg) 281 { 282 if(pFtArg !=NULL) pFtArg->SetText(aArg ); 283 } 284 285 /************************************************************************* 286 #* Member: GetArgName Datum:06.02.97 287 #*------------------------------------------------------------------------ 288 #* 289 #* Klasse: ArgInput 290 #* 291 #* Funktion: Liefert den Namen fuer das Argument zurueck 292 #* 293 #* Input: String 294 #* 295 #* Output: --- 296 #* 297 #************************************************************************/ 298 String ArgInput::GetArgName() 299 { 300 String aPrivArgName; 301 if(pFtArg !=NULL) 302 aPrivArgName=pFtArg->GetText(); 303 304 return aPrivArgName; 305 } 306 307 308 /************************************************************************* 309 #* Member: SetArgName Datum:13.01.97 310 #*------------------------------------------------------------------------ 311 #* 312 #* Klasse: ArgInput 313 #* 314 #* Funktion: Setzt den Namen fuer das Argument 315 #* 316 #* Input: String 317 #* 318 #* Output: --- 319 #* 320 #************************************************************************/ 321 void ArgInput::SetArgNameFont (const Font &aFont) 322 { 323 if(pFtArg !=NULL) pFtArg->SetFont(aFont); 324 } 325 326 /************************************************************************* 327 #* Member: SetArgSelection Datum:13.01.97 328 #*------------------------------------------------------------------------ 329 #* 330 #* Klasse: ArgInput 331 #* 332 #* Funktion: Stellt die Selection fuer die EditBox ein. 333 #* 334 #* Input: String 335 #* 336 #* Output: --- 337 #* 338 #************************************************************************/ 339 void ArgInput::SetArgSelection (const Selection& rSel ) 340 { 341 if(pEdArg !=NULL) pEdArg ->SetSelection(rSel ); 342 } 343 344 /************************************************************************* 345 #* Member: SetArgSelection Datum:13.01.97 346 #*------------------------------------------------------------------------ 347 #* 348 #* Klasse: ArgInput 349 #* 350 #* Funktion: Liefert die Selection fuer die EditBox zurueck. 351 #* 352 #* Input: String 353 #* 354 #* Output: --- 355 #* 356 #************************************************************************/ 357 Selection ArgInput::GetArgSelection () 358 { 359 Selection aSel; 360 if(pEdArg !=NULL) aSel=pEdArg ->GetSelection(); 361 return aSel; 362 } 363 364 /************************************************************************* 365 #* Member: SetArgSelection Datum:13.01.97 366 #*------------------------------------------------------------------------ 367 #* 368 #* Klasse: ArgInput 369 #* 370 #* Funktion: Ersetzt die Selection in der EditBox. 371 #* 372 #* Input: String 373 #* 374 #* Output: --- 375 #* 376 #************************************************************************/ 377 void ArgInput::ReplaceSelOfArg(const String& rStr ) 378 { 379 if(pEdArg !=NULL) pEdArg ->ReplaceSelected(rStr ); 380 } 381 382 383 384 /************************************************************************* 385 #* Member: SetArgVal Datum:13.01.97 386 #*------------------------------------------------------------------------ 387 #* 388 #* Klasse: ArgInput 389 #* 390 #* Funktion: Setzt den Wert fuer das Argument 391 #* 392 #* Input: String 393 #* 394 #* Output: --- 395 #* 396 #************************************************************************/ 397 void ArgInput::SetArgVal(const String &aVal) 398 { 399 if(pEdArg !=NULL) 400 { 401 pEdArg ->SetRefString(aVal ); 402 } 403 } 404 405 /************************************************************************* 406 #* Member: SetArgName Datum:13.01.97 407 #*------------------------------------------------------------------------ 408 #* 409 #* Klasse: ArgInput 410 #* 411 #* Funktion: Liefert den Wert fuer das Argument 412 #* 413 #* Input: --- 414 #* 415 #* Output: String 416 #* 417 #************************************************************************/ 418 String ArgInput::GetArgVal() 419 { 420 String aResult; 421 if(pEdArg!=NULL) 422 { 423 aResult=pEdArg->GetText(); 424 } 425 return aResult; 426 } 427 428 /************************************************************************* 429 #* Member: SetArgName Datum:13.01.97 430 #*------------------------------------------------------------------------ 431 #* 432 #* Klasse: ArgInput 433 #* 434 #* Funktion: Versteckt die Controls 435 #* 436 #* Input: --- 437 #* 438 #* Output: --- 439 #* 440 #************************************************************************/ 441 void ArgInput::Hide() 442 { 443 if ( pFtArg && pBtnFx && pEdArg && pRefBtn) 444 { 445 pFtArg->Hide(); 446 pBtnFx->Hide(); 447 pEdArg->Hide(); 448 pRefBtn->Hide(); 449 } 450 } 451 452 /************************************************************************* 453 #* Member: SetArgName Datum:13.01.97 454 #*------------------------------------------------------------------------ 455 #* 456 #* Klasse: ArgInput 457 #* 458 #* Funktion: Zaubert die Controls wieder hervor. 459 #* 460 #* Input: --- 461 #* 462 #* Output: --- 463 #* 464 #************************************************************************/ 465 void ArgInput::Show() 466 { 467 if ( pFtArg && pBtnFx && pEdArg && pRefBtn) 468 { 469 pFtArg->Show(); 470 pBtnFx->Show(); 471 pEdArg->Show(); 472 pRefBtn->Show(); 473 } 474 } 475 476 /************************************************************************* 477 #* Member: FxClick Datum:13.01.97 478 #*------------------------------------------------------------------------ 479 #* 480 #* Klasse: ArgInput 481 #* 482 #* Funktion: Gibt den Event weiter. 483 #* 484 #* Input: --- 485 #* 486 #* Output: --- 487 #* 488 #************************************************************************/ 489 void ArgInput::FxClick() 490 { 491 aFxClickLink.Call(this); 492 } 493 494 /************************************************************************* 495 #* Member: RefClick Datum:13.01.97 496 #*------------------------------------------------------------------------ 497 #* 498 #* Klasse: ArgInput 499 #* 500 #* Funktion: Gibt den Event weiter. 501 #* 502 #* Input: --- 503 #* 504 #* Output: --- 505 #* 506 #************************************************************************/ 507 void ArgInput::RefClick() 508 { 509 aRefClickLink.Call(this); 510 } 511 512 /************************************************************************* 513 #* Member: FxFocus Datum:13.01.97 514 #*------------------------------------------------------------------------ 515 #* 516 #* Klasse: ArgInput 517 #* 518 #* Funktion: Gibt den Event weiter. 519 #* 520 #* Input: --- 521 #* 522 #* Output: --- 523 #* 524 #************************************************************************/ 525 void ArgInput::FxFocus() 526 { 527 aFxFocusLink.Call(this); 528 } 529 530 /************************************************************************* 531 #* Member: RefFocus Datum:13.01.97 532 #*------------------------------------------------------------------------ 533 #* 534 #* Klasse: ArgInput 535 #* 536 #* Funktion: Gibt den Event weiter. 537 #* 538 #* Input: --- 539 #* 540 #* Output: --- 541 #* 542 #************************************************************************/ 543 void ArgInput::RefFocus() 544 { 545 aRefFocusLink.Call(this); 546 } 547 548 /************************************************************************* 549 #* Member: EdFocus Datum:13.01.97 550 #*------------------------------------------------------------------------ 551 #* 552 #* Klasse: ArgInput 553 #* 554 #* Funktion: Gibt den Event weiter. 555 #* 556 #* Input: --- 557 #* 558 #* Output: --- 559 #* 560 #************************************************************************/ 561 void ArgInput::EdFocus() 562 { 563 aEdFocusLink.Call(this); 564 } 565 566 /************************************************************************* 567 #* Member: EdModify Datum:13.01.97 568 #*------------------------------------------------------------------------ 569 #* 570 #* Klasse: ArgInput 571 #* 572 #* Funktion: Gibt den Event weiter. 573 #* 574 #* Input: --- 575 #* 576 #* Output: --- 577 #* 578 #************************************************************************/ 579 void ArgInput::EdModify() 580 { 581 aEdModifyLink.Call(this); 582 } 583 584 /************************************************************************* 585 #* Handle: FxBtnHdl Datum:13.01.97 586 #*------------------------------------------------------------------------ 587 #* 588 #* Klasse: ArgInput 589 #* 590 #* Funktion: Handle fuer Fx-Button Click-Event. 591 #* 592 #* Input: --- 593 #* 594 #* Output: --- 595 #* 596 #************************************************************************/ 597 IMPL_LINK( ArgInput, FxBtnClickHdl, ImageButton*, pBtn ) 598 { 599 if(pBtn==pBtnFx) FxClick(); 600 601 return 0; 602 } 603 604 /************************************************************************* 605 #* Handle: RefBtnClickHdl Datum:13.01.97 606 #*------------------------------------------------------------------------ 607 #* 608 #* Klasse: ArgInput 609 #* 610 #* Funktion: Handle fuer Fx-Button Click-Event. 611 #* 612 #* Input: --- 613 #* 614 #* Output: --- 615 #* 616 #************************************************************************/ 617 IMPL_LINK( ArgInput, RefBtnClickHdl,RefButton*, pBtn ) 618 { 619 if(pRefBtn==pBtn) RefClick(); 620 621 return 0; 622 } 623 624 /************************************************************************* 625 #* Handle: FxBtnFocusHdl Datum:13.01.97 626 #*------------------------------------------------------------------------ 627 #* 628 #* Klasse: ArgInput 629 #* 630 #* Funktion: Handle fuer Fx-Button Focus-Event. 631 #* 632 #* Input: --- 633 #* 634 #* Output: --- 635 #* 636 #************************************************************************/ 637 IMPL_LINK( ArgInput, FxBtnFocusHdl, ImageButton*, pBtn ) 638 { 639 if(pBtn==pBtnFx) FxFocus(); 640 641 return 0; 642 } 643 644 /************************************************************************* 645 #* Handle: RefBtnFocusHdl Datum:13.01.97 646 #*------------------------------------------------------------------------ 647 #* 648 #* Klasse: ArgInput 649 #* 650 #* Funktion: Handle fuer Fx-Button Focus-Event. 651 #* 652 #* Input: --- 653 #* 654 #* Output: --- 655 #* 656 #************************************************************************/ 657 IMPL_LINK( ArgInput, RefBtnFocusHdl,RefButton*, pBtn ) 658 { 659 if(pRefBtn==pBtn) RefFocus(); 660 661 return 0; 662 } 663 664 /************************************************************************* 665 #* Handle: EdFocusHdl Datum:13.01.97 666 #*------------------------------------------------------------------------ 667 #* 668 #* Klasse: ArgInput 669 #* 670 #* Funktion: Handle fuer Fx-Button Focus-Event. 671 #* 672 #* Input: --- 673 #* 674 #* Output: --- 675 #* 676 #************************************************************************/ 677 IMPL_LINK( ArgInput, EdFocusHdl, ArgEdit*, pEd ) 678 { 679 if(pEd==pEdArg) EdFocus(); 680 681 return 0; 682 } 683 684 /************************************************************************* 685 #* Handle: RefBtnClickHdl Datum:13.01.97 686 #*------------------------------------------------------------------------ 687 #* 688 #* Klasse: ArgInput 689 #* 690 #* Funktion: Handle fuer Fx-Button Focus-Event. 691 #* 692 #* Input: --- 693 #* 694 #* Output: --- 695 #* 696 #************************************************************************/ 697 IMPL_LINK( ArgInput, EdModifyHdl,ArgEdit*, pEd ) 698 { 699 if(pEd==pEdArg) EdModify(); 700 701 return 0; 702 } 703 704 /************************************************************************* 705 #* Member: EditBox Datum:20.01.97 706 #*------------------------------------------------------------------------ 707 #* 708 #* Klasse: EditBox 709 #* 710 #* Funktion: Konstruktor der Klasse ArgInput 711 #* 712 #* Input: Parent, Window-Style 713 #* 714 #* Output: --- 715 #* 716 #************************************************************************/ 717 EditBox::EditBox( Window* pParent,WinBits nWinStyle) 718 :Control(pParent,nWinStyle|WB_DIALOGCONTROL) 719 { 720 pMEdit=new MultiLineEdit(this,WB_LEFT | WB_VSCROLL | (nWinStyle & WB_TABSTOP) | 721 WB_NOBORDER | WB_NOHIDESELECTION | WB_IGNORETAB); 722 723 pMEdit->Show(); 724 aOldSel=pMEdit->GetSelection(); 725 } 726 727 /************************************************************************* 728 #* Member: EditBox Datum:20.01.97 729 #*------------------------------------------------------------------------ 730 #* 731 #* Klasse: EditBox 732 #* 733 #* Funktion: Konstruktor der Klasse ArgInput 734 #* 735 #* Input: Parent, Resource 736 #* 737 #* Output: --- 738 #* 739 #************************************************************************/ 740 EditBox::EditBox( Window* pParent, const ResId& rResId ) 741 :Control(pParent,rResId), 742 bMouseFlag(sal_False) 743 { 744 WinBits nStyle=GetStyle(); 745 SetStyle( nStyle| WB_DIALOGCONTROL); 746 747 pMEdit=new MultiLineEdit(this,WB_LEFT | WB_VSCROLL | (nStyle & WB_TABSTOP) | 748 WB_NOBORDER | WB_NOHIDESELECTION | WB_IGNORETAB); 749 pMEdit->Show(); 750 aOldSel=pMEdit->GetSelection(); 751 Resize(); 752 WinBits nWinStyle=GetStyle() | WB_DIALOGCONTROL; 753 SetStyle(nWinStyle); 754 755 // #105582# the HelpId from the resource must be set for the MultiLineEdit, 756 // not for the control that contains it. 757 pMEdit->SetHelpId( GetHelpId() ); 758 SetHelpId( "" ); 759 } 760 761 EditBox::~EditBox() 762 { 763 MultiLineEdit* pTheEdit=pMEdit; 764 pMEdit->Disable(); 765 pMEdit=NULL; 766 delete pTheEdit; 767 } 768 /************************************************************************* 769 #* Member: EditBox Datum:20.01.97 770 #*------------------------------------------------------------------------ 771 #* 772 #* Klasse: EditBox 773 #* 774 #* Funktion: Wenn sich die Selektion geaendert hat, so wird 775 #* diese Funktion aufgerufen. 776 #* 777 #* Input: --- 778 #* 779 #* Output: --- 780 #* 781 #************************************************************************/ 782 void EditBox::SelectionChanged() 783 { 784 aSelChangedLink.Call(this); 785 } 786 787 /************************************************************************* 788 #* Member: EditBox Datum:20.05.98 789 #*------------------------------------------------------------------------ 790 #* 791 #* Klasse: EditBox 792 #* 793 #* Funktion: Wenn sich die Groesse geaendert hat, so muss 794 #* auch der MultiLineEdit angepasst werden.. 795 #* 796 #* Input: --- 797 #* 798 #* Output: --- 799 #* 800 #************************************************************************/ 801 void EditBox::Resize() 802 { 803 Size aSize=GetOutputSizePixel(); 804 if(pMEdit!=NULL) pMEdit->SetOutputSizePixel(aSize); 805 } 806 807 /************************************************************************* 808 #* Member: GetFocus Datum:26.05.98 809 #*------------------------------------------------------------------------ 810 #* 811 #* Klasse: EditBox 812 #* 813 #* Funktion: Wenn der Control aktiviert wird, so wird 814 #* die Selection aufgehoben und der Cursor ans 815 #* Ende gesetzt. 816 #* 817 #* Input: --- 818 #* 819 #* Output: --- 820 #* 821 #************************************************************************/ 822 void EditBox::GetFocus() 823 { 824 if(pMEdit!=NULL) 825 { 826 pMEdit->GrabFocus(); 827 } 828 } 829 830 831 832 /************************************************************************* 833 #* Member: EditBox Datum:20.01.97 834 #*------------------------------------------------------------------------ 835 #* 836 #* Klasse: EditBox 837 #* 838 #* Funktion: Wenn ein Event ausgeloest wird, so wird diese Routine 839 #* zuerst aufgerufen und ein PostUserEvent verschickt. 840 #* 841 #* Input: Notify-Event 842 #* 843 #* Output: --- 844 #* 845 #************************************************************************/ 846 long EditBox::PreNotify( NotifyEvent& rNEvt ) 847 { 848 long nResult=sal_True; 849 850 if(pMEdit==NULL) return nResult; 851 852 sal_uInt16 nSwitch=rNEvt.GetType(); 853 if(nSwitch==EVENT_KEYINPUT)// || nSwitch==EVENT_KEYUP) 854 { 855 const KeyCode& aKeyCode=rNEvt.GetKeyEvent()->GetKeyCode(); 856 sal_uInt16 nKey=aKeyCode.GetCode(); 857 if( (nKey==KEY_RETURN && !aKeyCode.IsShift()) || nKey==KEY_TAB ) 858 { 859 nResult=GetParent()->Notify(rNEvt); 860 } 861 else 862 { 863 nResult=Control::PreNotify(rNEvt); 864 Application::PostUserEvent( LINK( this, EditBox, ChangedHdl ) ); 865 } 866 867 } 868 else 869 { 870 nResult=Control::PreNotify(rNEvt); 871 872 if(nSwitch==EVENT_MOUSEBUTTONDOWN || nSwitch==EVENT_MOUSEBUTTONUP) 873 { 874 bMouseFlag=sal_True; 875 Application::PostUserEvent( LINK( this, EditBox, ChangedHdl ) ); 876 } 877 } 878 return nResult; 879 } 880 881 /************************************************************************* 882 #* Member: EditBox Datum:21.01.97 883 #*------------------------------------------------------------------------ 884 #* 885 #* Klasse: EditBox 886 #* 887 #* Funktion: Wenn ein Event ausgeloest wurde, so wird diese Routine 888 #* zuerst aufgerufen. 889 #* 890 #* Input: Key-Event 891 #* 892 #* Output: --- 893 #* 894 #************************************************************************/ 895 IMPL_LINK( EditBox, ChangedHdl, EditBox*, EMPTYARG ) 896 { 897 if(pMEdit!=NULL) 898 { 899 Selection aNewSel=pMEdit->GetSelection(); 900 901 if(aNewSel.Min()!=aOldSel.Min() || aNewSel.Max()!=aOldSel.Max()) 902 { 903 SelectionChanged(); 904 aOldSel=aNewSel; 905 } 906 } 907 return 0; 908 } 909 910 void EditBox::UpdateOldSel() 911 { 912 // if selection is set for editing a function, store it as aOldSel, 913 // so SelectionChanged isn't called in the next ChangedHdl call 914 915 if (pMEdit) 916 aOldSel = pMEdit->GetSelection(); 917 } 918 //---------------------------------------------------------------------------- 919 920 //============================================================================ 921 // class RefEdit 922 //---------------------------------------------------------------------------- 923 924 #define SC_ENABLE_TIME 100 925 926 RefEdit::RefEdit( Window* _pParent,IControlReferenceHandler* pParent, const ResId& rResId ) : 927 Edit( _pParent, rResId ), 928 pAnyRefDlg( pParent ), 929 bSilentFocus( sal_False ) 930 { 931 aTimer.SetTimeoutHdl( LINK( this, RefEdit, UpdateHdl ) ); 932 aTimer.SetTimeout( SC_ENABLE_TIME ); 933 } 934 935 RefEdit::RefEdit( Window* pParent, const ResId& rResId ) : 936 Edit( pParent, rResId ), 937 pAnyRefDlg( NULL ), 938 bSilentFocus( sal_False ) 939 { 940 } 941 942 RefEdit::~RefEdit() 943 { 944 aTimer.SetTimeoutHdl( Link() ); 945 aTimer.Stop(); 946 } 947 948 void RefEdit::SetRefString( const XubString& rStr ) 949 { 950 Edit::SetText( rStr ); 951 } 952 953 void RefEdit::SetText( const XubString& rStr ) 954 { 955 Edit::SetText( rStr ); 956 UpdateHdl( &aTimer ); 957 } 958 959 void RefEdit::StartUpdateData() 960 { 961 aTimer.Start(); 962 } 963 964 void RefEdit::SilentGrabFocus() 965 { 966 bSilentFocus = sal_True; 967 GrabFocus(); 968 bSilentFocus = sal_False; 969 } 970 971 void RefEdit::SetRefDialog( IControlReferenceHandler* pDlg ) 972 { 973 pAnyRefDlg = pDlg; 974 975 if( pDlg ) 976 { 977 aTimer.SetTimeoutHdl( LINK( this, RefEdit, UpdateHdl ) ); 978 aTimer.SetTimeout( SC_ENABLE_TIME ); 979 } 980 else 981 { 982 aTimer.SetTimeoutHdl( Link() ); 983 aTimer.Stop(); 984 } 985 } 986 987 void RefEdit::Modify() 988 { 989 Edit::Modify(); 990 if( pAnyRefDlg ) 991 pAnyRefDlg->HideReference(); 992 } 993 994 void RefEdit::KeyInput( const KeyEvent& rKEvt ) 995 { 996 const KeyCode& rKeyCode = rKEvt.GetKeyCode(); 997 if( pAnyRefDlg && !rKeyCode.GetModifier() && (rKeyCode.GetCode() == KEY_F2) ) 998 pAnyRefDlg->ReleaseFocus( this ); 999 else 1000 Edit::KeyInput( rKEvt ); 1001 } 1002 1003 void RefEdit::GetFocus() 1004 { 1005 Edit::GetFocus(); 1006 if( !bSilentFocus ) 1007 StartUpdateData(); 1008 } 1009 1010 void RefEdit::LoseFocus() 1011 { 1012 Edit::LoseFocus(); 1013 if( pAnyRefDlg ) 1014 pAnyRefDlg->HideReference(); 1015 } 1016 1017 IMPL_LINK( RefEdit, UpdateHdl, Timer*, EMPTYARG ) 1018 { 1019 if( pAnyRefDlg ) 1020 pAnyRefDlg->ShowReference( GetText() ); 1021 return 0; 1022 } 1023 1024 1025 //============================================================================ 1026 // class RefButton 1027 //---------------------------------------------------------------------------- 1028 RefButton::RefButton( Window* _pParent, const ResId& rResId) : 1029 ImageButton( _pParent, rResId ), 1030 aImgRefStart( ModuleRes( RID_BMP_REFBTN1 ) ), 1031 aImgRefStartHC( ModuleRes( RID_BMP_REFBTN1_H ) ), 1032 aImgRefDone( ModuleRes( RID_BMP_REFBTN2 ) ), 1033 aImgRefDoneHC( ModuleRes( RID_BMP_REFBTN2_H ) ), 1034 pAnyRefDlg( NULL ), 1035 pRefEdit( NULL ) 1036 { 1037 SetStartImage(); 1038 } 1039 1040 RefButton::RefButton( Window* _pParent, const ResId& rResId, RefEdit* pEdit, IControlReferenceHandler* _pDlg ) : 1041 ImageButton( _pParent, rResId ), 1042 aImgRefStart( ModuleRes( RID_BMP_REFBTN1 ) ), 1043 aImgRefStartHC( ModuleRes( RID_BMP_REFBTN1_H ) ), 1044 aImgRefDone( ModuleRes( RID_BMP_REFBTN2 ) ), 1045 aImgRefDoneHC( ModuleRes( RID_BMP_REFBTN2_H ) ), 1046 pAnyRefDlg( _pDlg ), 1047 pRefEdit( pEdit ) 1048 { 1049 SetStartImage(); 1050 } 1051 1052 void RefButton::SetStartImage() 1053 { 1054 SetModeImage( aImgRefStart ); 1055 SetModeImage( aImgRefStartHC, BMP_COLOR_HIGHCONTRAST ); 1056 } 1057 1058 void RefButton::SetEndImage() 1059 { 1060 SetModeImage( aImgRefDone ); 1061 SetModeImage( aImgRefDoneHC, BMP_COLOR_HIGHCONTRAST ); 1062 } 1063 1064 void RefButton::SetReferences( IControlReferenceHandler* pDlg, RefEdit* pEdit ) 1065 { 1066 pAnyRefDlg = pDlg; 1067 pRefEdit = pEdit; 1068 } 1069 1070 //---------------------------------------------------------------------------- 1071 1072 void RefButton::Click() 1073 { 1074 if( pAnyRefDlg ) 1075 pAnyRefDlg->ToggleCollapsed( pRefEdit, this ); 1076 } 1077 1078 void RefButton::KeyInput( const KeyEvent& rKEvt ) 1079 { 1080 const KeyCode& rKeyCode = rKEvt.GetKeyCode(); 1081 if( pAnyRefDlg && !rKeyCode.GetModifier() && (rKeyCode.GetCode() == KEY_F2) ) 1082 pAnyRefDlg->ReleaseFocus( pRefEdit ); 1083 else 1084 ImageButton::KeyInput( rKEvt ); 1085 } 1086 1087 void RefButton::GetFocus() 1088 { 1089 ImageButton::GetFocus(); 1090 if( pRefEdit ) 1091 pRefEdit->StartUpdateData(); 1092 } 1093 1094 void RefButton::LoseFocus() 1095 { 1096 ImageButton::LoseFocus(); 1097 if( pRefEdit ) 1098 pRefEdit->Modify(); 1099 } 1100 1101 1102 } // formula 1103