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