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 #include "wrapper.hxx" 25 26 #include <comphelper/processfactory.hxx> 27 #include <com/sun/star/awt/XMetricField.hpp> 28 #include <com/sun/star/awt/XNumericField.hpp> 29 #include <com/sun/star/awt/XTextComponent.hpp> 30 #include <com/sun/star/awt/XListBox.hpp> 31 #include <com/sun/star/awt/XComboBox.hpp> 32 #include <cppuhelper/implbase1.hxx> 33 #include <com/sun/star/awt/XActionListener.hpp> 34 #include <com/sun/star/awt/XItemListener.hpp> 35 #include <com/sun/star/awt/XMouseListener.hpp> 36 #include <vcl/combobox.hxx> 37 #include <vcl/lstbox.hxx> 38 39 #include <toolkit/awt/vclxwindows.hxx> 40 41 using namespace ::com::sun::star; 42 using rtl::OUString; 43 44 #define LAYOUT_API_CALLS_HANDLER 0 45 46 namespace layout 47 { 48 49 class EditImpl : public ControlImpl 50 , public ::cppu::WeakImplHelper1< awt::XTextListener > 51 { 52 public: 53 Link maModifyHdl; 54 55 uno::Reference< awt::XTextComponent > mxEdit; 56 EditImpl( Context *context, const PeerHandle &peer, Window *window ) 57 : ControlImpl( context, peer, window ) 58 , mxEdit( peer, uno::UNO_QUERY ) 59 { 60 } 61 62 ~EditImpl (); 63 64 virtual void SAL_CALL disposing( lang::EventObject const& e ) 65 throw (uno::RuntimeException); 66 67 virtual void SetModifyHdl( Link const& link ); 68 69 void SAL_CALL textChanged( const awt::TextEvent& /* rEvent */ ) 70 throw (uno::RuntimeException) 71 { 72 maModifyHdl.Call( mpWindow ); 73 } 74 }; 75 76 EditImpl::~EditImpl () 77 { 78 } 79 80 void SAL_CALL EditImpl::disposing( lang::EventObject const& e ) 81 throw (uno::RuntimeException) 82 { 83 ControlImpl::disposing (e); 84 mxEdit.clear (); 85 } 86 87 void EditImpl::SetModifyHdl( Link const& link ) 88 { 89 if (!link && !!maModifyHdl) 90 mxEdit->removeTextListener( this ); 91 else if (!!link && !maModifyHdl) 92 mxEdit->addTextListener( this ); 93 maModifyHdl = link; 94 } 95 96 Edit::~Edit () 97 { 98 SetModifyHdl (Link ()); 99 } 100 101 void Edit::SetSelection( Selection const& rSelection ) 102 { 103 #if LAYOUT_API_CALLS_HANDLER 104 if ( !getImpl()->mxEdit.is() ) 105 getImpl()->mxEdit->setSelection( awt::Selection( rSelection.Min(), rSelection.Max() ) ); 106 #else /* !LAYOUT_API_CALLS_HANDLER */ 107 GetEdit ()->SetSelection (rSelection); 108 #endif /* !LAYOUT_API_CALLS_HANDLER */ 109 } 110 111 void Edit::SetText( OUString const& rStr ) 112 { 113 #if LAYOUT_API_CALLS_HANDLER 114 if ( getImpl()->mxEdit.is() ) 115 /// this calls handlers; endless loop in numfmt.cxx 116 getImpl()->mxEdit->setText( rStr ); 117 #else /* !LAYOUT_API_CALLS_HANDLER */ 118 GetEdit ()->SetText (rStr); 119 #endif /* !LAYOUT_API_CALLS_HANDLER */ 120 } 121 122 String Edit::GetText() const 123 { 124 if ( !getImpl()->mxEdit.is() ) 125 return getImpl()->mxEdit->getText(); 126 return OUString(); 127 } 128 129 void Edit::SetModifyHdl( const Link& link ) 130 { 131 if (getImpl() && getImpl()->mxEdit.is ()) 132 getImpl()->SetModifyHdl( link ); 133 } 134 135 IMPL_CONSTRUCTORS( Edit, Control, "edit" ); 136 IMPL_GET_IMPL( Edit ); 137 IMPL_GET_WINDOW (Edit); 138 139 class MultiLineEditImpl : public EditImpl 140 { 141 public: 142 MultiLineEditImpl( Context *context, const PeerHandle &peer, Window *window ) 143 : EditImpl( context, peer, window ) 144 { 145 } 146 }; 147 148 IMPL_CONSTRUCTORS( MultiLineEdit, Edit, "multilineedit" ); 149 IMPL_GET_IMPL( MultiLineEdit ); 150 151 class SpinFieldImpl : public EditImpl 152 { 153 public: 154 SpinFieldImpl( Context *context, const PeerHandle &peer, Window *window ) 155 : EditImpl( context, peer, window ) 156 { 157 } 158 }; 159 160 IMPL_CONSTRUCTORS( SpinField, Edit, "spinfield" ); 161 162 class NumericFieldImpl : public SpinFieldImpl 163 { 164 public: 165 NumericFieldImpl( Context *context, const PeerHandle &peer, Window *window ) 166 : SpinFieldImpl( context, peer, window ) 167 { 168 } 169 }; 170 171 class MetricFieldImpl : public SpinFieldImpl 172 { 173 public: 174 MetricFieldImpl( Context *context, const PeerHandle &peer, Window *window ) 175 : SpinFieldImpl( context, peer, window ) 176 { 177 } 178 }; 179 180 IMPL_GET_IMPL( SpinField ); 181 IMPL_GET_IMPL( NumericField ); 182 IMPL_GET_IMPL( MetricField ); 183 184 class FormatterBaseImpl 185 { 186 protected: 187 PeerHandle mpeer; 188 public: 189 explicit FormatterBaseImpl( const PeerHandle &peer ) 190 : mpeer( peer ) 191 { 192 }; 193 }; 194 195 FormatterBase::FormatterBase( FormatterBaseImpl *pFormatImpl ) 196 : mpFormatImpl( pFormatImpl ) 197 { 198 } 199 200 class NumericFormatterImpl : public FormatterBaseImpl 201 { 202 public: 203 uno::Reference< awt::XNumericField > mxField; 204 explicit NumericFormatterImpl( const PeerHandle &peer ) 205 : FormatterBaseImpl( peer ) 206 , mxField( peer, uno::UNO_QUERY ) 207 { 208 } 209 210 // FIXME: burn that CPU ! cut/paste from vclxwindows.cxx 211 double valueToDouble( sal_Int64 nValue ) 212 { 213 sal_Int16 nDigits = mxField->getDecimalDigits(); 214 double n = (double)nValue; 215 for ( sal_uInt16 d = 0; d < nDigits; d++ ) 216 n /= 10; 217 return n; 218 } // FIXME: burn that CPU ! cut/paste from vclxwindows.cxx 219 sal_Int64 doubleToValue( double nValue ) 220 { 221 sal_Int16 nDigits = mxField->getDecimalDigits(); 222 double n = nValue; 223 for ( sal_uInt16 d = 0; d < nDigits; d++ ) 224 n *= 10; 225 return (sal_Int64) n; 226 } 227 }; 228 229 class MetricFormatterImpl : public FormatterBaseImpl 230 { 231 public: 232 uno::Reference< awt::XMetricField > mxField; 233 explicit MetricFormatterImpl( const PeerHandle &peer ) 234 : FormatterBaseImpl( peer ) 235 , mxField( peer, uno::UNO_QUERY ) 236 { 237 } 238 }; 239 240 NumericFormatter::NumericFormatter( FormatterBaseImpl *pImpl ) 241 : FormatterBase( pImpl ) 242 { 243 } 244 245 NumericFormatterImpl& NumericFormatter::getFormatImpl() const 246 { 247 return *( static_cast<NumericFormatterImpl *>( mpFormatImpl ) ); 248 } 249 250 #define SET_IMPL(vclmethod, idlmethod) \ 251 void NumericFormatter::vclmethod( sal_Int64 nValue ) \ 252 { \ 253 if ( !getFormatImpl().mxField.is() ) \ 254 return; \ 255 getFormatImpl().mxField->idlmethod( getFormatImpl().valueToDouble( nValue ) ); \ 256 } 257 258 SET_IMPL( SetMin, setMin ) 259 SET_IMPL( SetMax, setMax ) 260 SET_IMPL( SetLast, setLast ) 261 SET_IMPL( SetFirst, setFirst ) 262 SET_IMPL( SetValue, setValue ) 263 SET_IMPL( SetSpinSize, setSpinSize ) 264 265 sal_Int64 NumericFormatter::GetValue() const 266 { 267 if ( !getFormatImpl().mxField.is() ) 268 return 0; 269 return getFormatImpl().doubleToValue( getFormatImpl().mxField->getValue() ); 270 } 271 272 #undef SET_IMPL 273 274 IMPL_CONSTRUCTORS_2( NumericField, SpinField, NumericFormatter, "numericfield" ); 275 276 MetricFormatter::MetricFormatter( FormatterBaseImpl *pImpl ) 277 : FormatterBase( pImpl ) 278 { 279 } 280 MetricFormatterImpl& MetricFormatter::getFormatImpl() const 281 { return *( static_cast<MetricFormatterImpl *>( mpFormatImpl ) ); } 282 283 #define MetricUnitVclToUno(a) ((sal_uInt16)(a)) 284 285 #define SET_IMPL(vclmethod, idlmethod) \ 286 void MetricFormatter::vclmethod( sal_Int64 nValue, FieldUnit nUnit ) \ 287 { \ 288 if ( !getFormatImpl().mxField.is() ) \ 289 return; \ 290 getFormatImpl().mxField->idlmethod( nValue, MetricUnitVclToUno( nUnit ) ); \ 291 } 292 293 SET_IMPL( SetMin, setMin ) 294 SET_IMPL( SetMax, setMax ) 295 SET_IMPL( SetLast, setLast ) 296 SET_IMPL( SetFirst, setFirst ) 297 SET_IMPL( SetValue, setValue ) 298 299 #undef SET_IMPL 300 301 void MetricFormatter::SetSpinSize( sal_Int64 nValue ) 302 { 303 if ( !getFormatImpl().mxField.is() ) 304 return; 305 getFormatImpl().mxField->setSpinSize( nValue ); 306 } 307 308 sal_Int64 MetricFormatter::GetValue( FieldUnit nUnit ) const 309 { 310 if ( !getFormatImpl().mxField.is() ) 311 return 0; 312 return getFormatImpl().mxField->getValue( MetricUnitVclToUno( nUnit ) ); 313 } 314 315 IMPL_CONSTRUCTORS_2( MetricField, SpinField, MetricFormatter, "metricfield" ); 316 317 class ComboBoxImpl : public EditImpl 318 , public ::cppu::WeakImplHelper1< awt::XActionListener > 319 , public ::cppu::WeakImplHelper1< awt::XItemListener > 320 { 321 public: 322 uno::Reference< awt::XComboBox > mxComboBox; 323 324 Link maClickHdl; 325 Link maSelectHdl; 326 327 Window *parent; 328 329 ComboBoxImpl( Context *context, const PeerHandle &peer, Window *window ) 330 : EditImpl( context, peer, window ) 331 , mxComboBox( peer, uno::UNO_QUERY ) 332 { 333 } 334 335 ~ComboBoxImpl (); 336 337 sal_uInt16 InsertEntry( OUString const& rStr, sal_uInt16 nPos ) 338 { 339 if ( nPos == COMBOBOX_APPEND ) 340 nPos = GetEntryCount(); 341 mxComboBox->addItem( rtl::OUString( rStr ), nPos ); 342 return nPos; 343 } 344 345 void RemoveEntry( sal_uInt16 nPos ) 346 { 347 mxComboBox->removeItems( nPos, 1 ); 348 } 349 350 sal_uInt16 GetEntryPos( String const& rStr ) const 351 { 352 uno::Sequence< rtl::OUString> aItems( mxComboBox->getItems() ); 353 rtl::OUString rKey( rStr ); 354 sal_uInt16 n = sal::static_int_cast< sal_uInt16 >(aItems.getLength()); 355 for (sal_uInt16 i = 0; i < n; i++) 356 { 357 if ( aItems[ i ] == rKey ) 358 return i; 359 } 360 return COMBOBOX_ENTRY_NOTFOUND; 361 } 362 363 OUString GetEntry( sal_uInt16 nPos ) const 364 { 365 return OUString( mxComboBox->getItem( nPos ) ); 366 } 367 368 sal_uInt16 GetEntryCount() const 369 { 370 return mxComboBox->getItemCount(); 371 } 372 373 void SetClickHdl( Link const& link ) 374 { 375 if (!link && !!maClickHdl) 376 mxComboBox->removeActionListener( this ); 377 else if (!!link && !maClickHdl) 378 mxComboBox->addActionListener( this ); 379 maClickHdl = link; 380 } 381 382 void SetSelectHdl( Link const& link ) 383 { 384 if (!link && !!maSelectHdl) 385 mxComboBox->removeItemListener( this ); 386 else if (!!link && !maSelectHdl) 387 mxComboBox->addItemListener( this ); 388 maSelectHdl = link; 389 } 390 391 void SAL_CALL disposing( lang::EventObject const& e ) 392 throw (uno::RuntimeException); 393 394 void SAL_CALL actionPerformed (const awt::ActionEvent&) 395 throw (uno::RuntimeException) 396 { 397 ComboBox* pComboBox = static_cast<ComboBox*>( mpWindow ); 398 if ( !pComboBox ) 399 return; 400 maClickHdl.Call( pComboBox ); 401 } 402 403 void SAL_CALL itemStateChanged( awt::ItemEvent const&) 404 throw (uno::RuntimeException) 405 { 406 ComboBox* pComboBox = static_cast<ComboBox*>( mpWindow ); 407 if ( !pComboBox ) 408 return; 409 maSelectHdl.Call( pComboBox ); 410 } 411 }; 412 413 ComboBox::~ComboBox () 414 { 415 #ifndef __SUNPRO_CC 416 OSL_TRACE ("%s: deleting ComboBox for window: %p", __FUNCTION__, GetWindow ()); 417 #endif 418 } 419 420 ComboBoxImpl::~ComboBoxImpl () 421 { 422 #ifndef __SUNPRO_CC 423 OSL_TRACE ("%s: deleting ComboBoxImpl for window: %p", __FUNCTION__, mpWindow ? mpWindow->GetWindow () : 0); 424 OSL_TRACE ("%s: deleting ComboBoxImpl for listener: %p", __FUNCTION__, static_cast<XFocusListener*> (this)); 425 #endif 426 } 427 428 void ComboBoxImpl::disposing( lang::EventObject const& e ) 429 throw (uno::RuntimeException) 430 { 431 EditImpl::disposing (e); 432 mxComboBox.clear (); 433 } 434 435 sal_uInt16 ComboBox::InsertEntry( String const& rStr, sal_uInt16 nPos ) 436 { 437 return getImpl()->InsertEntry( rStr, nPos ); 438 } 439 440 void ComboBox::RemoveEntry( String const& rStr ) 441 { 442 getImpl()->RemoveEntry( GetEntryPos( rStr ) ); 443 } 444 445 void ComboBox::RemoveEntry( sal_uInt16 nPos ) 446 { 447 getImpl()->RemoveEntry( nPos ); 448 } 449 450 void ComboBox::Clear() 451 { 452 uno::Sequence< rtl::OUString> aNoItems; 453 if ( getImpl() ) 454 getImpl()->setProperty( "StringItemList", uno::Any( aNoItems ) ); 455 } 456 457 sal_uInt16 ComboBox::GetEntryPos( String const& rStr ) const 458 { 459 return getImpl()->GetEntryPos( rStr ); 460 } 461 462 String ComboBox::GetEntry( sal_uInt16 nPos ) const 463 { 464 rtl::OUString rItem = getImpl()->mxComboBox->getItem( nPos ); 465 return OUString( rItem ); 466 } 467 468 sal_uInt16 ComboBox::GetEntryCount() const 469 { 470 return getImpl()->GetEntryCount(); 471 } 472 473 void ComboBox::SetClickHdl( const Link& link ) 474 { 475 if (getImpl() && getImpl()->mxComboBox.is ()) 476 getImpl()->SetClickHdl( link ); 477 } 478 479 void ComboBox::SetSelectHdl( const Link& link ) 480 { 481 if (getImpl() && getImpl()->mxComboBox.is ()) 482 getImpl()->SetSelectHdl( link ); 483 } 484 485 void ComboBox::EnableAutocomplete (bool enable, bool matchCase) 486 { 487 GetComboBox ()->EnableAutocomplete (enable, matchCase); 488 } 489 490 IMPL_CONSTRUCTORS_BODY( ComboBox, Edit, "combobox", getImpl()->parent = parent; ); 491 IMPL_GET_WINDOW (ComboBox); 492 IMPL_GET_IMPL( ComboBox ); 493 494 class ListBoxImpl : public ControlImpl 495 , public ::cppu::WeakImplHelper1< awt::XActionListener > 496 , public ::cppu::WeakImplHelper1< awt::XItemListener > 497 , public ::cppu::WeakImplHelper1< awt::XMouseListener > 498 { 499 Link maClickHdl; 500 Link maSelectHdl; 501 Link maDoubleClickHdl; 502 503 public: 504 uno::Reference< awt::XListBox > mxListBox; 505 ListBoxImpl( Context *context, const PeerHandle &peer, Window *window ) 506 : ControlImpl( context, peer, window ) 507 , mxListBox( peer, uno::UNO_QUERY ) 508 { 509 SelectEntryPos (0, true); 510 } 511 512 sal_uInt16 InsertEntry (String const& rStr, sal_uInt16 nPos) 513 { 514 if ( nPos == LISTBOX_APPEND ) 515 nPos = mxListBox->getItemCount(); 516 mxListBox->addItem( rtl::OUString( rStr ), nPos ); 517 return nPos; 518 } 519 520 void RemoveEntry( sal_uInt16 nPos ) 521 { 522 mxListBox->removeItems( nPos, 1 ); 523 } 524 525 sal_uInt16 RemoveEntry( String const& rStr, sal_uInt16 nPos) 526 { 527 if ( nPos == LISTBOX_APPEND ) 528 nPos = mxListBox->getItemCount(); 529 mxListBox->addItem( rtl::OUString( rStr ), nPos ); 530 return nPos; 531 } 532 533 sal_uInt16 GetEntryPos( String const& rStr ) const 534 { 535 uno::Sequence< rtl::OUString> aItems( mxListBox->getItems() ); 536 rtl::OUString rKey( rStr ); 537 sal_uInt16 n = sal::static_int_cast< sal_uInt16 >(aItems.getLength()); 538 for (sal_uInt16 i = 0; i < n; i++) 539 { 540 if ( aItems[ i ] == rKey ) 541 return i; 542 } 543 return LISTBOX_ENTRY_NOTFOUND; 544 } 545 546 OUString GetEntry( sal_uInt16 nPos ) const 547 { 548 return mxListBox->getItem( nPos ); 549 } 550 551 sal_uInt16 GetEntryCount() const 552 { 553 return mxListBox->getItemCount(); 554 } 555 556 void SelectEntryPos( sal_uInt16 nPos, bool bSelect ) 557 { 558 mxListBox->selectItemPos( nPos, bSelect ); 559 } 560 561 sal_uInt16 GetSelectEntryCount() const 562 { 563 return sal::static_int_cast< sal_uInt16 >( mxListBox->getSelectedItems().getLength() ); 564 } 565 566 sal_uInt16 GetSelectEntryPos( sal_uInt16 nSelIndex ) const 567 { 568 sal_uInt16 nSelected = 0; 569 if ( mxListBox->isMutipleMode() ) 570 { 571 uno::Sequence< short > aItems( mxListBox->getSelectedItemsPos() ); 572 if ( nSelIndex < aItems.getLength() ) 573 nSelected = aItems[ nSelIndex ]; 574 } 575 else 576 nSelected = mxListBox->getSelectedItemPos(); 577 return nSelected; 578 } 579 580 virtual void SAL_CALL disposing( lang::EventObject const& e ) 581 throw (uno::RuntimeException) 582 { 583 ControlImpl::disposing (e); 584 mxListBox.clear (); 585 } 586 587 Link& GetClickHdl () 588 { 589 return maClickHdl; 590 } 591 592 void SetClickHdl( Link const& link ) 593 { 594 if (!link && !!maClickHdl) 595 mxListBox->removeActionListener( this ); 596 else if (!!link && !maClickHdl) 597 mxListBox->addActionListener( this ); 598 maClickHdl = link; 599 } 600 601 void SAL_CALL actionPerformed( const awt::ActionEvent& /* rEvent */ ) 602 throw (uno::RuntimeException) 603 { 604 maClickHdl.Call( mpWindow ); 605 } 606 607 Link& GetSelectHdl () 608 { 609 return maSelectHdl; 610 } 611 612 void SetSelectHdl( Link const& link ) 613 { 614 if (!link && !!maSelectHdl) 615 mxListBox->removeItemListener( this ); 616 else if (!!link && !maSelectHdl) 617 mxListBox->addItemListener( this ); 618 maSelectHdl = link; 619 } 620 621 void SAL_CALL itemStateChanged (awt::ItemEvent const&) 622 throw (uno::RuntimeException) 623 { 624 maSelectHdl.Call (static_cast <ListBox*> (mpWindow)); 625 } 626 627 Link& GetDoubleClickHdl () 628 { 629 return maDoubleClickHdl; 630 } 631 632 void SetDoubleClickHdl (Link const& link) 633 { 634 if (!link && !!maDoubleClickHdl) 635 mxWindow->removeMouseListener (this); 636 else if (!!link && !maSelectHdl) 637 mxWindow->addMouseListener (this); 638 maDoubleClickHdl = link; 639 } 640 641 void SAL_CALL mousePressed (awt::MouseEvent const&) throw (uno::RuntimeException) 642 { 643 } 644 void SAL_CALL mouseReleased (awt::MouseEvent const& e) throw (uno::RuntimeException) 645 { 646 if (e.ClickCount == 2) 647 maDoubleClickHdl.Call (mpWindow); 648 } 649 void SAL_CALL mouseEntered (awt::MouseEvent const&) throw (uno::RuntimeException) 650 { 651 } 652 void SAL_CALL mouseExited (awt::MouseEvent const&) throw (uno::RuntimeException) 653 { 654 } 655 }; 656 657 ListBox::~ListBox () 658 { 659 } 660 661 sal_uInt16 ListBox::InsertEntry (String const& rStr, sal_uInt16 nPos) 662 { 663 return getImpl()->InsertEntry(rStr, nPos); 664 } 665 666 void ListBox::RemoveEntry( sal_uInt16 nPos ) 667 { 668 return getImpl()->RemoveEntry( nPos ); 669 } 670 671 void ListBox::RemoveEntry( String const& rStr ) 672 { 673 return getImpl()->RemoveEntry( GetEntryPos( rStr ) ); 674 } 675 676 void ListBox::Clear() 677 { 678 uno::Sequence< rtl::OUString> aNoItems; 679 if ( getImpl() ) 680 getImpl()->setProperty( "StringItemList", uno::Any( aNoItems ) ); 681 } 682 683 sal_uInt16 ListBox::GetEntryPos( String const& rStr ) const 684 { 685 return getImpl()->GetEntryPos( rStr ); 686 } 687 688 String ListBox::GetEntry( sal_uInt16 nPos ) const 689 { 690 return getImpl()->GetEntry( nPos ); 691 } 692 693 sal_uInt16 ListBox::GetEntryCount() const 694 { 695 return getImpl()->GetEntryCount(); 696 } 697 698 void ListBox::SelectEntryPos( sal_uInt16 nPos, bool bSelect ) 699 { 700 #if LAYOUT_API_CALLS_HANDLER 701 getImpl()->SelectEntryPos( nPos, bSelect ); 702 #else /* !LAYOUT_API_CALLS_HANDLER */ 703 GetListBox ()->SelectEntryPos (nPos, bSelect); 704 #endif /* !LAYOUT_API_CALLS_HANDLER */ 705 } 706 707 void ListBox::SelectEntry( String const& rStr, bool bSelect ) 708 { 709 SelectEntryPos( GetEntryPos( rStr ), bSelect ); 710 } 711 712 sal_uInt16 ListBox::GetSelectEntryCount() const 713 { 714 return getImpl()->GetSelectEntryCount(); 715 } 716 717 sal_uInt16 ListBox::GetSelectEntryPos( sal_uInt16 nSelIndex ) const 718 { 719 return getImpl()->GetSelectEntryPos( nSelIndex ); 720 } 721 722 String ListBox::GetSelectEntry( sal_uInt16 nSelIndex ) const 723 { 724 return GetEntry( GetSelectEntryPos( nSelIndex ) ); 725 } 726 727 Link& ListBox::GetSelectHdl () 728 { 729 return getImpl()->GetSelectHdl (); 730 } 731 732 void ListBox::SetSelectHdl( Link const& link ) 733 { 734 getImpl()->SetSelectHdl( link ); 735 } 736 737 Link& ListBox::GetClickHdl () 738 { 739 return getImpl()->GetSelectHdl (); 740 } 741 742 void ListBox::SetClickHdl( Link const& link ) 743 { 744 if (getImpl() && getImpl()->mxListBox.is ()) 745 getImpl()->SetClickHdl( link ); 746 } 747 748 Link& ListBox::GetDoubleClickHdl () 749 { 750 return getImpl()->GetSelectHdl (); 751 } 752 753 void ListBox::SetDoubleClickHdl( Link const& link ) 754 { 755 getImpl()->SetDoubleClickHdl( link ); 756 } 757 758 void ListBox::SetEntryData( sal_uInt16 pos, void* data) 759 { 760 GetListBox ()->SetEntryData (pos, data); 761 } 762 763 void* ListBox::GetEntryData( sal_uInt16 pos) const 764 { 765 return GetListBox ()->GetEntryData (pos); 766 } 767 768 void ListBox::SetNoSelection () 769 { 770 GetListBox ()->SetNoSelection (); 771 } 772 773 IMPL_CONSTRUCTORS (ListBox, Control, "listbox"); 774 IMPL_GET_IMPL (ListBox); 775 IMPL_GET_WINDOW (ListBox); 776 777 IMPL_IMPL (MultiListBox, ListBox) 778 IMPL_CONSTRUCTORS_BODY( MultiListBox, ListBox, "multilistbox", GetMultiListBox()->EnableMultiSelection( true ); ); 779 IMPL_GET_IMPL( MultiListBox ); 780 IMPL_GET_WINDOW( MultiListBox ); 781 } // namespace layout 782