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