xref: /trunk/main/vcl/source/window/btndlg.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_vcl.hxx"
26 
27 #include <tools/ref.hxx>
28 #include <tools/debug.hxx>
29 #include <tools/rc.h>
30 
31 #include <svdata.hxx>
32 
33 #include <vcl/button.hxx>
34 #include <vcl/btndlg.hxx>
35 
36 
37 
38 // =======================================================================
39 
40 struct ImplBtnDlgItem
41 {
42 	sal_uInt16				mnId;
43 	sal_Bool				mbOwnButton;
44 	sal_Bool				mbDummyAlign;
45 	long				mnSepSize;
46 	PushButton* 		mpPushButton;
47 };
48 
DECLARE_LIST(ImplBtnDlgItemList,ImplBtnDlgItem *)49 DECLARE_LIST( ImplBtnDlgItemList, ImplBtnDlgItem* )
50 
51 // =======================================================================
52 
53 void ButtonDialog::ImplInitButtonDialogData()
54 {
55 	mpItemList				= new ImplBtnDlgItemList( 8, 8 );
56 	mnButtonSize			= 0;
57 	mnCurButtonId			= 0;
58 	mnFocusButtonId 		= BUTTONDIALOG_BUTTON_NOTFOUND;
59 	mbFormat				= sal_True;
60 }
61 
62 // -----------------------------------------------------------------------
63 
ButtonDialog(WindowType nType)64 ButtonDialog::ButtonDialog( WindowType nType ) :
65 	Dialog( nType )
66 {
67 	ImplInitButtonDialogData();
68 }
69 
70 // -----------------------------------------------------------------------
71 
ButtonDialog(Window * pParent,WinBits nStyle)72 ButtonDialog::ButtonDialog( Window* pParent, WinBits nStyle ) :
73 	Dialog( WINDOW_BUTTONDIALOG )
74 {
75 	ImplInitButtonDialogData();
76 	ImplInit( pParent, nStyle );
77 }
78 
79 // -----------------------------------------------------------------------
80 
ButtonDialog(Window * pParent,const ResId & rResId)81 ButtonDialog::ButtonDialog( Window* pParent, const ResId& rResId ) :
82 	Dialog( WINDOW_BUTTONDIALOG )
83 {
84 	ImplInitButtonDialogData();
85 	rResId.SetRT( RSC_DIALOG ); 	// !!!!!!!!!! RSC_BUTTONDIALOG !!!!!!!!
86 	ImplInit( pParent, ImplInitRes( rResId ) );
87 	ImplLoadRes( rResId );
88 }
89 
90 // -----------------------------------------------------------------------
91 
~ButtonDialog()92 ButtonDialog::~ButtonDialog()
93 {
94 	ImplBtnDlgItem* pItem = mpItemList->First();
95 	while ( pItem )
96 	{
97 		if ( pItem->mpPushButton && pItem->mbOwnButton )
98 			delete pItem->mpPushButton;
99 		delete pItem;
100 		pItem = mpItemList->Next();
101 	}
102 
103 	delete mpItemList;
104 }
105 
106 // -----------------------------------------------------------------------
107 
ImplCreatePushButton(sal_uInt16 nBtnFlags)108 PushButton* ButtonDialog::ImplCreatePushButton( sal_uInt16 nBtnFlags )
109 {
110 	PushButton* pBtn;
111 	WinBits 	nStyle = 0;
112 
113 	if ( nBtnFlags & BUTTONDIALOG_DEFBUTTON )
114 		nStyle |= WB_DEFBUTTON;
115 	if ( nBtnFlags & BUTTONDIALOG_CANCELBUTTON )
116 		pBtn = new CancelButton( this, nStyle );
117 	else if ( nBtnFlags & BUTTONDIALOG_OKBUTTON )
118 		pBtn = new OKButton( this, nStyle );
119 	else if ( nBtnFlags & BUTTONDIALOG_HELPBUTTON )
120 		pBtn = new HelpButton( this, nStyle );
121 	else
122 		pBtn = new PushButton( this, nStyle );
123 
124 	if ( !(nBtnFlags & BUTTONDIALOG_HELPBUTTON) )
125 		pBtn->SetClickHdl( LINK( this, ButtonDialog, ImplClickHdl ) );
126 
127 	return pBtn;
128 }
129 
130 // -----------------------------------------------------------------------
131 
ImplGetItem(sal_uInt16 nId) const132 ImplBtnDlgItem* ButtonDialog::ImplGetItem( sal_uInt16 nId ) const
133 {
134 	ImplBtnDlgItem* pItem = mpItemList->First();
135 	while ( pItem )
136 	{
137 		if ( pItem->mnId == nId )
138 			return pItem;
139 
140 		pItem = mpItemList->Next();
141 	}
142 
143 	return NULL;
144 }
145 
146 // -----------------------------------------------------------------------
147 
ImplGetButtonSize()148 long ButtonDialog::ImplGetButtonSize()
149 {
150 	if ( !mbFormat )
151 		return mnButtonSize;
152 
153 	// Calculate ButtonSize
154 	long	nLastSepSize = 0;
155 	long	nSepSize = 0;
156 	long	nButtonCount = 0;
157 	maCtrlSize = Size( IMPL_MINSIZE_BUTTON_WIDTH, IMPL_MINSIZE_BUTTON_HEIGHT );
158 	ImplBtnDlgItem* pItem = mpItemList->First();
159 	while ( pItem )
160 	{
161 		nSepSize += nLastSepSize;
162 
163 		long nTxtWidth = pItem->mpPushButton->GetCtrlTextWidth( pItem->mpPushButton->GetText() );
164 		nTxtWidth += IMPL_EXTRA_BUTTON_WIDTH;
165 		if ( nTxtWidth > maCtrlSize.Width() )
166 			maCtrlSize.Width() = nTxtWidth;
167 		long nTxtHeight = pItem->mpPushButton->GetTextHeight();
168 		nTxtHeight += IMPL_EXTRA_BUTTON_HEIGHT;
169 		if ( nTxtHeight > maCtrlSize.Height() )
170 			maCtrlSize.Height() = nTxtHeight;
171 
172 		nSepSize += pItem->mnSepSize;
173 
174 		if ( GetStyle() & WB_HORZ )
175 			nLastSepSize = IMPL_SEP_BUTTON_X;
176 		else
177 			nLastSepSize = IMPL_SEP_BUTTON_Y;
178 
179 		nButtonCount++;
180 
181 		pItem = mpItemList->Next();
182 	}
183 
184 	if ( GetStyle() & WB_HORZ )
185 		mnButtonSize  = nSepSize + (nButtonCount*maCtrlSize.Width());
186 	else
187 		mnButtonSize = nSepSize + (nButtonCount*maCtrlSize.Height());
188 
189 	return mnButtonSize;
190 }
191 
192 // -----------------------------------------------------------------------
193 
ImplPosControls()194 void ButtonDialog::ImplPosControls()
195 {
196 	if ( !mbFormat )
197 		return;
198 
199 	// Create PushButtons and determine Sizes
200 	ImplGetButtonSize();
201 
202 	// determine dialog size
203 	ImplBtnDlgItem* pItem;
204 	Size			aDlgSize = maPageSize;
205 	long			nX;
206 	long			nY;
207 	if ( GetStyle() & WB_HORZ )
208 	{
209 		if ( mnButtonSize+(IMPL_DIALOG_OFFSET*2) > aDlgSize.Width() )
210 			aDlgSize.Width() = mnButtonSize+(IMPL_DIALOG_OFFSET*2);
211 		if ( GetStyle() & WB_LEFT )
212 			nX = IMPL_DIALOG_OFFSET;
213 		else if ( GetStyle() & WB_RIGHT )
214 			nX = aDlgSize.Width()-mnButtonSize-IMPL_DIALOG_OFFSET;
215 		else
216 			nX = (aDlgSize.Width()-mnButtonSize)/2;
217 
218 		aDlgSize.Height() += IMPL_DIALOG_OFFSET+maCtrlSize.Height();
219 		nY = aDlgSize.Height()-maCtrlSize.Height()-IMPL_DIALOG_OFFSET;
220 	}
221 	else
222 	{
223 		if ( mnButtonSize+(IMPL_DIALOG_OFFSET*2) > aDlgSize.Height() )
224 			aDlgSize.Height() = mnButtonSize+(IMPL_DIALOG_OFFSET*2);
225 		if ( GetStyle() & WB_BOTTOM )
226 			nY = aDlgSize.Height()-mnButtonSize-IMPL_DIALOG_OFFSET;
227 		else if ( GetStyle() & WB_VCENTER )
228 			nY = (aDlgSize.Height()-mnButtonSize)/2;
229 		else
230 			nY = IMPL_DIALOG_OFFSET;
231 
232 		aDlgSize.Width() += IMPL_DIALOG_OFFSET+maCtrlSize.Width();
233 		nX = aDlgSize.Width()-maCtrlSize.Width()-IMPL_DIALOG_OFFSET;
234 	}
235 
236 	// Arrange PushButtons
237 	pItem = mpItemList->First();
238 	while ( pItem )
239 	{
240 		if ( GetStyle() & WB_HORZ )
241 			nX += pItem->mnSepSize;
242 		else
243 			nY += pItem->mnSepSize;
244 		pItem->mpPushButton->SetPosSizePixel( Point( nX, nY ), maCtrlSize );
245 		pItem->mpPushButton->Show();
246 		if ( GetStyle() & WB_HORZ )
247 			nX += maCtrlSize.Width()+IMPL_SEP_BUTTON_X;
248 		else
249 			nY += maCtrlSize.Height()+IMPL_SEP_BUTTON_Y;
250 
251 		pItem = mpItemList->Next();
252 	}
253 
254 	SetOutputSizePixel( aDlgSize );
255 
256 	mbFormat = sal_False;
257 }
258 
259 // -----------------------------------------------------------------------
260 
IMPL_LINK(ButtonDialog,ImplClickHdl,PushButton *,pBtn)261 IMPL_LINK( ButtonDialog, ImplClickHdl, PushButton*, pBtn )
262 {
263 	ImplBtnDlgItem* pItem = mpItemList->First();
264 	while ( pItem )
265 	{
266 		if ( pItem->mpPushButton == pBtn )
267 		{
268 			mnCurButtonId = pItem->mnId;
269 			Click();
270 			break;
271 		}
272 
273 		pItem = mpItemList->Next();
274 	}
275 
276 	return 0;
277 }
278 
279 // -----------------------------------------------------------------------
280 
Resize()281 void ButtonDialog::Resize()
282 {
283 }
284 
285 // -----------------------------------------------------------------------
286 
StateChanged(StateChangedType nType)287 void ButtonDialog::StateChanged( StateChangedType nType )
288 {
289 	if ( nType == STATE_CHANGE_INITSHOW )
290 	{
291 		ImplPosControls();
292 		ImplBtnDlgItem* pItem = mpItemList->First();
293 		while ( pItem )
294 		{
295 			if ( pItem->mpPushButton && pItem->mbOwnButton )
296 				pItem->mpPushButton->SetZOrder(0, WINDOW_ZORDER_LAST);
297 			pItem = mpItemList->Next();
298 		}
299 
300 		// Focus evt. auf den entsprechenden Button setzen
301 		if ( mnFocusButtonId != BUTTONDIALOG_BUTTON_NOTFOUND )
302 		{
303 			ImplBtnDlgItem* pItem = mpItemList->First();
304 			while ( pItem )
305 			{
306 				if ( pItem->mnId == mnFocusButtonId )
307 				{
308 					if ( pItem->mpPushButton->IsVisible() )
309 						pItem->mpPushButton->GrabFocus();
310 					break;
311 				}
312 
313 				pItem = mpItemList->Next();
314 			}
315 		}
316 	}
317 
318 	Dialog::StateChanged( nType );
319 }
320 
321 // -----------------------------------------------------------------------
322 
Click()323 void ButtonDialog::Click()
324 {
325 	if ( !maClickHdl )
326 	{
327 		if ( IsInExecute() )
328 			EndDialog( GetCurButtonId() );
329 	}
330 	else
331 		maClickHdl.Call( this );
332 }
333 
334 // -----------------------------------------------------------------------
335 
AddButton(const XubString & rText,sal_uInt16 nId,sal_uInt16 nBtnFlags,long nSepPixel)336 void ButtonDialog::AddButton( const XubString& rText, sal_uInt16 nId,
337 							  sal_uInt16 nBtnFlags, long nSepPixel )
338 {
339 	// PageItem anlegen
340 	ImplBtnDlgItem* pItem	= new ImplBtnDlgItem;
341 	pItem->mnId 			= nId;
342 	pItem->mbOwnButton		= sal_True;
343 	pItem->mnSepSize		= nSepPixel;
344 	pItem->mpPushButton 	= ImplCreatePushButton( nBtnFlags );
345 	if ( rText.Len() )
346 		pItem->mpPushButton->SetText( rText );
347 
348 	// In die Liste eintragen
349 	mpItemList->Insert( pItem, LIST_APPEND );
350 
351 	if ( nBtnFlags & BUTTONDIALOG_FOCUSBUTTON )
352 		mnFocusButtonId = nId;
353 
354 	mbFormat = sal_True;
355 }
356 
357 // -----------------------------------------------------------------------
358 
AddButton(StandardButtonType eType,sal_uInt16 nId,sal_uInt16 nBtnFlags,long nSepPixel)359 void ButtonDialog::AddButton( StandardButtonType eType, sal_uInt16 nId,
360 							  sal_uInt16 nBtnFlags, long nSepPixel )
361 {
362 	// PageItem anlegen
363 	ImplBtnDlgItem* pItem	= new ImplBtnDlgItem;
364 	pItem->mnId 			= nId;
365 	pItem->mbOwnButton		= sal_True;
366 	pItem->mnSepSize		= nSepPixel;
367 
368 	if ( eType == BUTTON_OK )
369 		nBtnFlags |= BUTTONDIALOG_OKBUTTON;
370 	else if ( eType == BUTTON_HELP )
371 		nBtnFlags |= BUTTONDIALOG_HELPBUTTON;
372 	else if ( (eType == BUTTON_CANCEL) || (eType == BUTTON_CLOSE) )
373 		nBtnFlags |= BUTTONDIALOG_CANCELBUTTON;
374 	pItem->mpPushButton = ImplCreatePushButton( nBtnFlags );
375 
376 	// Standard-Buttons have the right text already
377 	if ( !((eType == BUTTON_OK) 	&& (pItem->mpPushButton->GetType() == WINDOW_OKBUTTON)) ||
378 		 !((eType == BUTTON_CANCEL) && (pItem->mpPushButton->GetType() == WINDOW_CANCELBUTTON)) ||
379 		 !((eType == BUTTON_HELP)	&& (pItem->mpPushButton->GetType() == WINDOW_HELPBUTTON)) )
380 	{
381 		pItem->mpPushButton->SetText( Button::GetStandardText( eType ) );
382 		pItem->mpPushButton->SetHelpText( Button::GetStandardHelpText( eType ) );
383 	}
384 
385 	if ( nBtnFlags & BUTTONDIALOG_FOCUSBUTTON )
386 		mnFocusButtonId = nId;
387 
388 	// In die Liste eintragen
389 	mpItemList->Insert( pItem, LIST_APPEND );
390 
391 	mbFormat = sal_True;
392 }
393 
394 // -----------------------------------------------------------------------
395 
AddButton(PushButton * pBtn,sal_uInt16 nId,sal_uInt16 nBtnFlags,long nSepPixel)396 void ButtonDialog::AddButton( PushButton* pBtn, sal_uInt16 nId,
397 							  sal_uInt16 nBtnFlags, long nSepPixel )
398 {
399 	// PageItem anlegen
400 	ImplBtnDlgItem* pItem	= new ImplBtnDlgItem;
401 	pItem->mnId 			= nId;
402 	pItem->mbOwnButton		= sal_False;
403 	pItem->mnSepSize		= nSepPixel;
404 	pItem->mpPushButton 	= pBtn;
405 
406 	if ( nBtnFlags & BUTTONDIALOG_FOCUSBUTTON )
407 		mnFocusButtonId = nId;
408 
409 	// In die View-Liste eintragen
410 	mpItemList->Insert( pItem, LIST_APPEND );
411 
412 	mbFormat = sal_True;
413 }
414 
415 // -----------------------------------------------------------------------
416 
RemoveButton(sal_uInt16 nId)417 void ButtonDialog::RemoveButton( sal_uInt16 nId )
418 {
419 	ImplBtnDlgItem* pItem = mpItemList->First();
420 	while ( pItem )
421 	{
422 		if ( pItem->mnId == nId )
423 		{
424 			pItem->mpPushButton->Hide();
425 			if ( pItem->mbOwnButton )
426 				delete pItem->mpPushButton;
427 			delete pItem;
428 			mpItemList->Remove();
429 			mbFormat = sal_True;
430 			break;
431 		}
432 
433 		pItem = mpItemList->Next();
434 	}
435 
436 	DBG_ERRORFILE( "ButtonDialog::RemoveButton(): ButtonId invalid" );
437 }
438 
439 // -----------------------------------------------------------------------
440 
Clear()441 void ButtonDialog::Clear()
442 {
443 	ImplBtnDlgItem* pItem = mpItemList->First();
444 	while ( pItem )
445 	{
446 		pItem->mpPushButton->Hide();
447 		if ( pItem->mbOwnButton )
448 			delete pItem->mpPushButton;
449 		delete pItem;
450 		pItem = mpItemList->Next();
451 	}
452 
453 	mpItemList->Clear();
454 	mbFormat = sal_True;
455 }
456 
457 // -----------------------------------------------------------------------
458 
GetButtonCount() const459 sal_uInt16 ButtonDialog::GetButtonCount() const
460 {
461 	return (sal_uInt16)mpItemList->Count();
462 }
463 
464 // -----------------------------------------------------------------------
465 
GetButtonId(sal_uInt16 nButton) const466 sal_uInt16 ButtonDialog::GetButtonId( sal_uInt16 nButton ) const
467 {
468 	if ( nButton < mpItemList->Count() )
469 		return (sal_uInt16)mpItemList->GetObject( nButton )->mnId;
470 	else
471 		return BUTTONDIALOG_BUTTON_NOTFOUND;
472 }
473 
474 // -----------------------------------------------------------------------
475 
GetPushButton(sal_uInt16 nId) const476 PushButton* ButtonDialog::GetPushButton( sal_uInt16 nId ) const
477 {
478 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
479 
480 	if ( pItem )
481 		return pItem->mpPushButton;
482 	else
483 		return NULL;
484 }
485 
486 // -----------------------------------------------------------------------
487 
SetButtonText(sal_uInt16 nId,const XubString & rText)488 void ButtonDialog::SetButtonText( sal_uInt16 nId, const XubString& rText )
489 {
490 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
491 
492 	if ( pItem )
493 	{
494 		pItem->mpPushButton->SetText( rText );
495 		mbFormat = sal_True;
496 	}
497 }
498 
499 // -----------------------------------------------------------------------
500 
GetButtonText(sal_uInt16 nId) const501 XubString ButtonDialog::GetButtonText( sal_uInt16 nId ) const
502 {
503 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
504 
505 	if ( pItem )
506 		return pItem->mpPushButton->GetText();
507 	else
508 		return ImplGetSVEmptyStr();
509 }
510 
511 // -----------------------------------------------------------------------
512 
SetButtonHelpText(sal_uInt16 nId,const XubString & rText)513 void ButtonDialog::SetButtonHelpText( sal_uInt16 nId, const XubString& rText )
514 {
515 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
516 
517 	if ( pItem )
518 		pItem->mpPushButton->SetHelpText( rText );
519 }
520 
521 // -----------------------------------------------------------------------
522 
GetButtonHelpText(sal_uInt16 nId) const523 XubString ButtonDialog::GetButtonHelpText( sal_uInt16 nId ) const
524 {
525 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
526 
527 	if ( pItem )
528 		return pItem->mpPushButton->GetHelpText();
529 	else
530 		return ImplGetSVEmptyStr();
531 }
532 
533 // -----------------------------------------------------------------------
534 
SetButtonHelpId(sal_uInt16 nId,const rtl::OString & rHelpId)535 void ButtonDialog::SetButtonHelpId( sal_uInt16 nId, const rtl::OString& rHelpId )
536 {
537 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
538 
539 	if ( pItem )
540 		pItem->mpPushButton->SetHelpId( rHelpId );
541 }
542 
543 // -----------------------------------------------------------------------
544 
GetButtonHelpId(sal_uInt16 nId) const545 rtl::OString ButtonDialog::GetButtonHelpId( sal_uInt16 nId ) const
546 {
547 	ImplBtnDlgItem* pItem = ImplGetItem( nId );
548 
549 	return pItem ? rtl::OString( pItem->mpPushButton->GetHelpId() ) : rtl::OString();
550 }
551