xref: /AOO41X/main/formula/source/ui/dlg/funcutl.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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