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