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 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 64 ButtonDialog::ButtonDialog( WindowType nType ) : 65 Dialog( nType ) 66 { 67 ImplInitButtonDialogData(); 68 } 69 70 // ----------------------------------------------------------------------- 71 72 ButtonDialog::ButtonDialog( Window* pParent, WinBits nStyle ) : 73 Dialog( WINDOW_BUTTONDIALOG ) 74 { 75 ImplInitButtonDialogData(); 76 ImplInit( pParent, nStyle ); 77 } 78 79 // ----------------------------------------------------------------------- 80 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 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 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 132 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 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 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 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 281 void ButtonDialog::Resize() 282 { 283 } 284 285 // ----------------------------------------------------------------------- 286 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 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 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 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 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 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 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 459 sal_uInt16 ButtonDialog::GetButtonCount() const 460 { 461 return (sal_uInt16)mpItemList->Count(); 462 } 463 464 // ----------------------------------------------------------------------- 465 466 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 476 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 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 501 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 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 523 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 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 545 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