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 #ifndef _SV_ILSTBOX_HXX 25 #define _SV_ILSTBOX_HXX 26 27 #include <vcl/sv.h> 28 #include <vcl/image.hxx> 29 #include <vcl/ctrl.hxx> 30 #include <vcl/button.hxx> 31 #include <vcl/floatwin.hxx> 32 #include <vcl/lstbox.h> 33 #include <vcl/timer.hxx> 34 35 #include "vcl/quickselectionengine.hxx" 36 37 class ScrollBar; 38 class ScrollBarBox; 39 40 // ----------------- 41 // - ListBox-Types - 42 // ----------------- 43 44 #define HORZ_SCROLL 4 45 #define IMG_TXT_DISTANCE 6 46 47 enum LB_EVENT_TYPE 48 { 49 LET_MBDOWN, 50 LET_TRACKING, 51 LET_TRACKING_END, 52 LET_KEYMOVE, 53 LET_KEYSPACE 54 }; 55 56 // ----------------- 57 // - ImplEntryType - 58 // ----------------- 59 60 struct ImplEntryType 61 { 62 XubString maStr; 63 Image maImage; 64 void* mpUserData; 65 sal_Bool mbIsSelected; 66 long mnFlags; 67 long mnHeight; 68 69 ImplEntryType( const XubString& rStr, const Image& rImage ) : 70 maStr( rStr ), 71 maImage( rImage ), 72 mnFlags( 0 ), 73 mnHeight( 0 ) 74 { 75 mbIsSelected = sal_False; 76 mpUserData = NULL; 77 } 78 79 ImplEntryType( const XubString& rStr ) : 80 maStr( rStr ), 81 mnFlags( 0 ), 82 mnHeight( 0 ) 83 { 84 mbIsSelected = sal_False; 85 mpUserData = NULL; 86 } 87 88 ImplEntryType( const Image& rImage ) : 89 maImage( rImage ), 90 mnFlags( 0 ), 91 mnHeight( 0 ) 92 { 93 mbIsSelected = sal_False; 94 mpUserData = NULL; 95 } 96 }; 97 98 // ----------------- 99 // - ImplEntryList - 100 // ----------------- 101 102 class ImplEntryList : private List 103 { 104 private: 105 Window* mpWindow; // For getting the current locale when matching strings 106 sal_uInt16 mnLastSelected; 107 sal_uInt16 mnSelectionAnchor; 108 sal_uInt16 mnImages; 109 110 sal_uInt16 mnMRUCount; 111 sal_uInt16 mnMaxMRUCount; 112 113 Link maSelectionChangedHdl; 114 sal_Bool mbCallSelectionChangedHdl; 115 116 ImplEntryType* GetEntry( sal_uInt16 nPos ) const { return (ImplEntryType*)List::GetObject( nPos ); } 117 118 public: 119 ImplEntryList( Window* pWindow ); 120 ~ImplEntryList(); 121 122 sal_uInt16 InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry, sal_Bool bSort ); 123 void RemoveEntry( sal_uInt16 nPos ); 124 const ImplEntryType* GetEntryPtr( sal_uInt16 nPos ) const { return (const ImplEntryType*) GetObject( nPos ); } 125 ImplEntryType* GetMutableEntryPtr( sal_uInt16 nPos ) const { return (ImplEntryType*) GetObject( nPos ); } 126 void Clear(); 127 128 sal_uInt16 FindMatchingEntry( const XubString& rStr, sal_uInt16 nStart = 0, sal_Bool bForward = sal_True, sal_Bool bLazy = sal_True ) const; 129 sal_uInt16 FindEntry( const XubString& rStr, sal_Bool bSearchMRUArea = sal_False ) const; 130 sal_uInt16 FindEntry( const void* pData ) const; 131 132 // helper: add up heights up to index nEndIndex. 133 // GetAddedHeight( 0 ) returns 0 134 // GetAddedHeight( LISTBOX_ENTRY_NOTFOUND ) returns 0 135 // GetAddedHeight( i, k ) with k > i is equivalent -GetAddedHeight( k, i ) 136 long GetAddedHeight( sal_uInt16 nEndIndex, sal_uInt16 nBeginIndex = 0, long nBeginHeight = 0 ) const; 137 long GetEntryHeight( sal_uInt16 nPos ) const; 138 139 sal_uInt16 GetEntryCount() const { return (sal_uInt16)List::Count(); } 140 sal_Bool HasImages() const { return mnImages ? sal_True : sal_False; } 141 142 XubString GetEntryText( sal_uInt16 nPos ) const; 143 144 sal_Bool HasEntryImage( sal_uInt16 nPos ) const; 145 Image GetEntryImage( sal_uInt16 nPos ) const; 146 147 void SetEntryData( sal_uInt16 nPos, void* pNewData ); 148 void* GetEntryData( sal_uInt16 nPos ) const; 149 150 void SetEntryFlags( sal_uInt16 nPos, long nFlags ); 151 long GetEntryFlags( sal_uInt16 nPos ) const; 152 153 void SelectEntry( sal_uInt16 nPos, sal_Bool bSelect ); 154 155 sal_uInt16 GetSelectEntryCount() const; 156 XubString GetSelectEntry( sal_uInt16 nIndex ) const; 157 sal_uInt16 GetSelectEntryPos( sal_uInt16 nIndex ) const; 158 sal_Bool IsEntrySelected( const XubString& rStr ) const; 159 sal_Bool IsEntryPosSelected( sal_uInt16 nIndex ) const; 160 161 void SetLastSelected( sal_uInt16 nPos ) { mnLastSelected = nPos; } 162 sal_uInt16 GetLastSelected() const { return mnLastSelected; } 163 164 void SetSelectionAnchor( sal_uInt16 nPos ) { mnSelectionAnchor = nPos; } 165 sal_uInt16 GetSelectionAnchor() const { return mnSelectionAnchor; } 166 167 168 void SetSelectionChangedHdl( const Link& rLnk ) { maSelectionChangedHdl = rLnk; } 169 void SetCallSelectionChangedHdl( sal_Bool bCall ) { mbCallSelectionChangedHdl = bCall; } 170 171 void SetMRUCount( sal_uInt16 n ) { mnMRUCount = n; } 172 sal_uInt16 GetMRUCount() const { return mnMRUCount; } 173 174 void SetMaxMRUCount( sal_uInt16 n ) { mnMaxMRUCount = n; } 175 sal_uInt16 GetMaxMRUCount() const { return mnMaxMRUCount; } 176 177 /** An Entry is selectable if its mnFlags does not have the 178 LISTBOX_ENTRY_FLAG_DISABLE_SELECTION flag set. */ 179 bool IsEntrySelectable( sal_uInt16 nPos ) const; 180 181 /** returns the first entry found from the given position nPos that is selectable 182 or LISTBOX_ENTRY_NOTFOUND if non is found. If the entry at nPos is not selectable, 183 it returns the first selectable entry after nPos if bForward is true and the 184 first selectable entry after nPos is bForward is false. 185 */ 186 sal_uInt16 FindFirstSelectable( sal_uInt16 nPos, bool bForward = true ); 187 }; 188 189 // --------------------- 190 // - ImplListBoxWindow - 191 // --------------------- 192 193 class ImplListBoxWindow : public Control, public ::vcl::ISearchableStringList 194 { 195 private: 196 ImplEntryList* mpEntryList; // EntryListe 197 Rectangle maFocusRect; 198 199 Size maUserItemSize; 200 201 long mnMaxTxtHeight; // Maximale Hoehe eines Text-Items 202 long mnMaxTxtWidth; // Maximale Breite eines Text-Items 203 // Entry ohne Image 204 long mnMaxImgTxtWidth;// Maximale Breite eines Text-Items 205 // Entry UND Image 206 long mnMaxImgWidth; // Maximale Breite eines Image-Items 207 long mnMaxImgHeight; // Maximale Hoehe eines Image-Items 208 long mnMaxWidth; // Maximale Breite eines Eintrags 209 long mnMaxHeight; // Maximale Hoehe eines Eintrags 210 211 sal_uInt16 mnCurrentPos; // Position (Focus) 212 sal_uInt16 mnTrackingSaveSelection; // Selektion vor Tracking(); 213 214 sal_uInt16 mnSeparatorPos; // Separator 215 216 sal_uInt16 mnUserDrawEntry; 217 218 sal_uInt16 mnTop; // Ausgabe ab Zeile 219 long mnLeft; // Ausgabe ab Spalte 220 long mnBorder; // Abstand Rahmen - Text 221 long mnTextHeight; // Texthoehe 222 ProminentEntry meProminentType; // where is the "prominent" entry 223 224 sal_uInt16 mnSelectModifier; // Modifiers 225 226 /// bitfield 227 bool mbHasFocusRect : 1; 228 bool mbSort : 1; // ListBox sortiert 229 bool mbTrack : 1; // Tracking 230 bool mbMulti : 1; // MultiListBox 231 bool mbStackMode : 1; // StackSelection 232 bool mbSimpleMode : 1; // SimpleMode fuer MultiListBox 233 bool mbImgsDiffSz : 1; // Images haben verschiedene Groessen 234 bool mbTravelSelect : 1; // TravelSelect 235 bool mbTrackingSelect : 1; // Selektiert bei MouseMove 236 bool mbSelectionChanged : 1; // Select() nicht zu oft rufen... 237 bool mbMouseMoveSelect : 1; // Selektieren bei MouseMove 238 bool mbGrabFocus : 1; // Focus bei MBDown grabben 239 bool mbUserDrawEnabled : 1; // UserDraw possible 240 bool mbInUserDraw : 1; // In UserDraw 241 bool mbReadOnly : 1; // ReadOnly 242 bool mbMirroring : 1; // pb: #106948# explicit mirroring for calc 243 bool mbRight : 1; // right align Text output 244 bool mbCenter : 1; // center Text output 245 bool mbEdgeBlending : 1; 246 247 Link maScrollHdl; 248 Link maSelectHdl; 249 Link maCancelHdl; 250 Link maDoubleClickHdl; 251 Link maUserDrawHdl; 252 Link maMRUChangedHdl; 253 254 ::vcl::QuickSelectionEngine maQuickSelectionEngine; 255 256 protected: 257 virtual void KeyInput( const KeyEvent& rKEvt ); 258 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 259 virtual void MouseMove( const MouseEvent& rMEvt ); 260 virtual void Tracking( const TrackingEvent& rTEvt ); 261 virtual void Paint( const Rectangle& rRect ); 262 virtual void Resize(); 263 virtual void GetFocus(); 264 virtual void LoseFocus(); 265 266 sal_Bool SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False ); 267 void ImplPaint( sal_uInt16 nPos, sal_Bool bErase = sal_False, bool bLayout = false ); 268 void ImplDoPaint( const Rectangle& rRect, bool bLayout = false ); 269 void ImplCalcMetrics(); 270 void ImplUpdateEntryMetrics( ImplEntryType& rEntry ); 271 void ImplCallSelect(); 272 273 void ImplShowFocusRect(); 274 void ImplHideFocusRect(); 275 276 277 virtual void StateChanged( StateChangedType nType ); 278 virtual void DataChanged( const DataChangedEvent& rDCEvt ); 279 280 public: 281 virtual void FillLayoutData() const; 282 283 ImplListBoxWindow( Window* pParent, WinBits nWinStyle ); 284 ~ImplListBoxWindow(); 285 286 ImplEntryList* GetEntryList() const { return mpEntryList; } 287 288 sal_uInt16 InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry ); 289 void RemoveEntry( sal_uInt16 nPos ); 290 void Clear(); 291 void ResetCurrentPos() { mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; } 292 sal_uInt16 GetCurrentPos() const { return mnCurrentPos; } 293 sal_uInt16 GetDisplayLineCount() const; 294 void SetEntryFlags( sal_uInt16 nPos, long nFlags ); 295 296 void DrawEntry( sal_uInt16 nPos, sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false ); 297 298 void SelectEntry( sal_uInt16 nPos, sal_Bool bSelect ); 299 void DeselectAll(); 300 sal_uInt16 GetEntryPosForPoint( const Point& rPoint ) const; 301 sal_uInt16 GetLastVisibleEntry() const; 302 303 sal_Bool ProcessKeyInput( const KeyEvent& rKEvt ); 304 305 void SetTopEntry( sal_uInt16 nTop ); 306 sal_uInt16 GetTopEntry() const { return mnTop; } 307 // ShowProminentEntry will set the entry correspoding to nEntryPos 308 // either at top or in the middle depending on the chosen style 309 void ShowProminentEntry( sal_uInt16 nEntryPos ); 310 void SetProminentEntryType( ProminentEntry eType ) { meProminentType = eType; } 311 ProminentEntry GetProminentEntryType() const { return meProminentType; } 312 using Window::IsVisible; 313 sal_Bool IsVisible( sal_uInt16 nEntry ) const; 314 315 long GetLeftIndent() const { return mnLeft; } 316 void SetLeftIndent( long n ); 317 void ScrollHorz( long nDiff ); 318 319 void AllowGrabFocus( bool b ) { mbGrabFocus = b; } 320 bool IsGrabFocusAllowed() const { return mbGrabFocus; } 321 322 void SetSeparatorPos( sal_uInt16 n ) { mnSeparatorPos = n; } 323 sal_uInt16 GetSeparatorPos() const { return mnSeparatorPos; } 324 325 void SetTravelSelect( bool bTravelSelect ) { mbTravelSelect = bTravelSelect; } 326 bool IsTravelSelect() const { return mbTravelSelect; } 327 bool IsTrackingSelect() const { return mbTrackingSelect; } 328 329 void SetUserItemSize( const Size& rSz ); 330 const Size& GetUserItemSize() const { return maUserItemSize; } 331 332 void EnableUserDraw( bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; } 333 bool IsUserDrawEnabled() const { return mbUserDrawEnabled; } 334 335 void EnableMultiSelection( bool bMulti, bool bStackMode ) { mbMulti = bMulti; mbStackMode = bStackMode; } 336 bool IsMultiSelectionEnabled() const { return mbMulti; } 337 338 void SetMultiSelectionSimpleMode( bool bSimple ) { mbSimpleMode = bSimple; } 339 bool IsMultiSelectionSimpleMode() const { return mbSimpleMode; } 340 341 void EnableMouseMoveSelect( bool bMouseMoveSelect ) { mbMouseMoveSelect = bMouseMoveSelect; } 342 bool IsMouseMoveSelectEnabled() const { return mbMouseMoveSelect; } 343 bool IsMouseMoveSelect() const { return mbMouseMoveSelect||mbStackMode; } 344 345 Size CalcSize( sal_uInt16 nMaxLines ) const; 346 Rectangle GetBoundingRectangle( sal_uInt16 nItem ) const; 347 348 long GetEntryHeight() const { return mnMaxHeight; } 349 long GetMaxEntryWidth() const { return mnMaxWidth; } 350 351 void SetScrollHdl( const Link& rLink ) { maScrollHdl = rLink; } 352 const Link& GetScrollHdl() const { return maScrollHdl; } 353 void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; } 354 const Link& GetSelectHdl() const { return maSelectHdl; } 355 void SetCancelHdl( const Link& rLink ) { maCancelHdl = rLink; } 356 const Link& GetCancelHdl() const { return maCancelHdl; } 357 void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; } 358 const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; } 359 void SetUserDrawHdl( const Link& rLink ) { maUserDrawHdl = rLink; } 360 const Link& GetUserDrawHdl() const { return maUserDrawHdl; } 361 void SetMRUChangedHdl( const Link& rLink ) { maMRUChangedHdl = rLink; } 362 const Link& GetMRUChangedHdl() const { return maMRUChangedHdl; } 363 364 bool IsSelectionChanged() const { return mbSelectionChanged; } 365 sal_uInt16 GetSelectModifier() const { return mnSelectModifier; } 366 367 void EnableSort( bool b ) { mbSort = b; } 368 369 void SetReadOnly( bool bReadOnly ) { mbReadOnly = bReadOnly; } 370 bool IsReadOnly() const { return mbReadOnly; } 371 372 using Control::ImplInitSettings; 373 void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); 374 sal_uInt16 ImplGetTextStyle() const; 375 376 // pb: #106948# explicit mirroring for calc 377 inline void EnableMirroring() { mbMirroring = true; } 378 inline bool IsMirroring() const { return mbMirroring; } 379 380 bool GetEdgeBlending() const { return mbEdgeBlending; } 381 void SetEdgeBlending(bool bNew) { mbEdgeBlending = bNew; } 382 383 protected: 384 // ISearchableStringList 385 virtual ::vcl::StringEntryIdentifier CurrentEntry( String& _out_entryText ) const; 386 virtual ::vcl::StringEntryIdentifier NextEntry( ::vcl::StringEntryIdentifier _currentEntry, String& _out_entryText ) const; 387 virtual void SelectEntry( ::vcl::StringEntryIdentifier _entry ); 388 }; 389 390 // --------------- 391 // - ImplListBox - 392 // --------------- 393 394 class ImplListBox : public Control 395 { 396 private: 397 ImplListBoxWindow maLBWindow; 398 ScrollBar* mpHScrollBar; 399 ScrollBar* mpVScrollBar; 400 ScrollBarBox* mpScrollBarBox; 401 402 /// bitfield 403 bool mbVScroll : 1; // VScroll an oder aus 404 bool mbHScroll : 1; // HScroll an oder aus 405 bool mbAutoHScroll : 1; // AutoHScroll an oder aus 406 bool mbEdgeBlending : 1; 407 408 Link maScrollHdl; // Weil der vom ImplListBoxWindow selbst benoetigt wird. 409 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxDNDListenerContainer; 410 411 protected: 412 virtual void GetFocus(); 413 virtual void StateChanged( StateChangedType nType ); 414 virtual void DataChanged( const DataChangedEvent& rDCEvt ); 415 416 long Notify( NotifyEvent& rNEvt ); 417 418 void ImplResizeControls(); 419 void ImplCheckScrollBars(); 420 void ImplInitScrollBars(); 421 422 DECL_LINK( ScrollBarHdl, ScrollBar* ); 423 DECL_LINK( LBWindowScrolled, void* ); 424 DECL_LINK( MRUChanged, void* ); 425 426 public: 427 ImplListBox( Window* pParent, WinBits nWinStyle ); 428 ~ImplListBox(); 429 430 const ImplEntryList* GetEntryList() const { return maLBWindow.GetEntryList(); } 431 ImplListBoxWindow* GetMainWindow() { return &maLBWindow; } 432 433 virtual void Resize(); 434 virtual const Wallpaper& GetDisplayBackground() const; 435 virtual Window* GetPreferredKeyInputWindow(); 436 437 sal_uInt16 InsertEntry( sal_uInt16 nPos, const XubString& rStr ); 438 sal_uInt16 InsertEntry( sal_uInt16 nPos, const Image& rImage ); 439 sal_uInt16 InsertEntry( sal_uInt16 nPos, const XubString& rStr, const Image& rImage ); 440 void RemoveEntry( sal_uInt16 nPos ); 441 void SetEntryData( sal_uInt16 nPos, void* pNewData ) { maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); } 442 void Clear(); 443 444 void SetEntryFlags( sal_uInt16 nPos, long nFlags ); 445 long GetEntryFlags( sal_uInt16 nPos ) const; 446 447 void SelectEntry( sal_uInt16 nPos, sal_Bool bSelect ); 448 void SetNoSelection(); 449 void ResetCurrentPos() { maLBWindow.ResetCurrentPos(); } 450 sal_uInt16 GetCurrentPos() const { return maLBWindow.GetCurrentPos(); } 451 452 sal_Bool ProcessKeyInput( const KeyEvent& rKEvt ) { return maLBWindow.ProcessKeyInput( rKEvt ); } 453 sal_Bool HandleWheelAsCursorTravel( const CommandEvent& rCEvt ); 454 455 void SetSeparatorPos( sal_uInt16 n ) { maLBWindow.SetSeparatorPos( n ); } 456 sal_uInt16 GetSeparatorPos() const { return maLBWindow.GetSeparatorPos(); } 457 458 void SetTopEntry( sal_uInt16 nTop ) { maLBWindow.SetTopEntry( nTop ); } 459 sal_uInt16 GetTopEntry() const { return maLBWindow.GetTopEntry(); } 460 void ShowProminentEntry( sal_uInt16 nPos ) { maLBWindow.ShowProminentEntry( nPos ); } 461 using Window::IsVisible; 462 sal_Bool IsVisible( sal_uInt16 nEntry ) const { return maLBWindow.IsVisible( nEntry ); } 463 464 void SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); } 465 ProminentEntry GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); } 466 467 long GetLeftIndent() const { return maLBWindow.GetLeftIndent(); } 468 void SetLeftIndent( sal_uInt16 n ) { maLBWindow.SetLeftIndent( n ); } 469 void ScrollHorz( short nDiff ) { maLBWindow.ScrollHorz( nDiff ); } 470 471 void SetTravelSelect( sal_Bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); } 472 sal_Bool IsTravelSelect() const { return maLBWindow.IsTravelSelect(); } 473 sal_Bool IsTrackingSelect() const { return maLBWindow.IsTrackingSelect(); } 474 475 void EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); } 476 sal_Bool IsMultiSelectionEnabled() const { return maLBWindow.IsMultiSelectionEnabled(); } 477 478 void SetMultiSelectionSimpleMode( sal_Bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); } 479 sal_Bool IsMultiSelectionSimpleMode() const { return maLBWindow.IsMultiSelectionSimpleMode(); } 480 481 void SetReadOnly( sal_Bool b ) { maLBWindow.SetReadOnly( b ); } 482 sal_Bool IsReadOnly() const { return maLBWindow.IsReadOnly(); } 483 484 485 Size CalcSize( sal_uInt16 nMaxLines ) const { return maLBWindow.CalcSize( nMaxLines ); } 486 long GetEntryHeight() const { return maLBWindow.GetEntryHeight(); } 487 long GetMaxEntryWidth() const { return maLBWindow.GetMaxEntryWidth(); } 488 489 void SetScrollHdl( const Link& rLink ) { maScrollHdl = rLink; } 490 const Link& GetScrollHdl() const { return maScrollHdl; } 491 void SetSelectHdl( const Link& rLink ) { maLBWindow.SetSelectHdl( rLink ); } 492 const Link& GetSelectHdl() const { return maLBWindow.GetSelectHdl(); } 493 void SetCancelHdl( const Link& rLink ) { maLBWindow.SetCancelHdl( rLink ); } 494 const Link& GetCancelHdl() const { return maLBWindow.GetCancelHdl(); } 495 void SetDoubleClickHdl( const Link& rLink ) { maLBWindow.SetDoubleClickHdl( rLink ); } 496 const Link& GetDoubleClickHdl() const { return maLBWindow.GetDoubleClickHdl(); } 497 void SetUserDrawHdl( const Link& rLink ) { maLBWindow.SetUserDrawHdl( rLink ); } 498 const Link& GetUserDrawHdl() const { return maLBWindow.GetUserDrawHdl(); } 499 500 void SetSelectionChangedHdl( const Link& rLnk ) { maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); } 501 void SetCallSelectionChangedHdl( sal_Bool bCall ) { maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); } 502 sal_Bool IsSelectionChanged() const { return maLBWindow.IsSelectionChanged(); } 503 sal_uInt16 GetSelectModifier() const { return maLBWindow.GetSelectModifier(); } 504 505 void SetMRUEntries( const XubString& rEntries, xub_Unicode cSep ); 506 XubString GetMRUEntries( xub_Unicode cSep ) const; 507 void SetMaxMRUCount( sal_uInt16 n ) { maLBWindow.GetEntryList()->SetMaxMRUCount( n ); } 508 sal_uInt16 GetMaxMRUCount() const { return maLBWindow.GetEntryList()->GetMaxMRUCount(); } 509 sal_uInt16 GetDisplayLineCount() const 510 { return maLBWindow.GetDisplayLineCount(); } 511 512 bool GetEdgeBlending() const { return mbEdgeBlending; } 513 void SetEdgeBlending(bool bNew); 514 515 // pb: #106948# explicit mirroring for calc 516 inline void EnableMirroring() { maLBWindow.EnableMirroring(); } 517 inline void SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; } 518 }; 519 520 // ----------------------------- 521 // - ImplListBoxFloatingWindow - 522 // ----------------------------- 523 524 class ImplListBoxFloatingWindow : public FloatingWindow 525 { 526 private: 527 ImplListBox* mpImplLB; 528 Size maPrefSz; 529 sal_uInt16 mnDDLineCount; 530 sal_uInt16 mnPopupModeStartSaveSelection; 531 sal_Bool mbAutoWidth; 532 533 protected: 534 long PreNotify( NotifyEvent& rNEvt ); 535 536 public: 537 ImplListBoxFloatingWindow( Window* pParent ); 538 539 void SetImplListBox( ImplListBox* pLB ) { mpImplLB = pLB; } 540 541 void SetPrefSize( const Size& rSz ) { maPrefSz = rSz; } 542 const Size& GetPrefSize() const { return maPrefSz; } 543 544 void SetAutoWidth( sal_Bool b ) { mbAutoWidth = b; } 545 sal_Bool IsAutoWidth() const { return mbAutoWidth; } 546 547 Size CalcFloatSize(); 548 void StartFloat( sal_Bool bStartTracking ); 549 550 virtual void SetPosSizePixel( long nX, long nY, 551 long nWidth, long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL ); 552 void SetPosSizePixel( const Point& rNewPos, const Size& rNewSize ) 553 { FloatingWindow::SetPosSizePixel( rNewPos, rNewSize ); } 554 555 void SetDropDownLineCount( sal_uInt16 n ) { mnDDLineCount = n; } 556 sal_uInt16 GetDropDownLineCount() const { return mnDDLineCount; } 557 558 sal_uInt16 GetPopupModeStartSaveSelection() const { return mnPopupModeStartSaveSelection; } 559 560 virtual void Resize(); 561 }; 562 563 // ----------- 564 // - ImplWin - 565 // ----------- 566 567 class ImplWin : public Control 568 { 569 private: 570 571 sal_uInt16 mnItemPos; // wegen UserDraw muss ich wissen, welches Item ich darstelle. 572 XubString maString; 573 Image maImage; 574 Image maImageHC; 575 576 Rectangle maFocusRect; 577 Size maUserItemSize; 578 579 Link maMBDownHdl; 580 Link maUserDrawHdl; 581 582 /// bitfield 583 bool mbUserDrawEnabled : 1; 584 bool mbInUserDraw : 1; 585 bool mbEdgeBlending : 1; 586 587 void ImplDraw( bool bLayout = false ); 588 protected: 589 virtual void FillLayoutData() const; 590 public: 591 592 ImplWin( Window* pParent, WinBits nWinStyle = 0 ); 593 ~ImplWin() {}; 594 595 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 596 virtual void Paint( const Rectangle& rRect ); 597 virtual void Resize(); 598 virtual void GetFocus(); 599 virtual void LoseFocus(); 600 virtual long PreNotify( NotifyEvent& rNEvt ); 601 602 sal_uInt16 GetItemPos() const { return mnItemPos; } 603 void SetItemPos( sal_uInt16 n ) { mnItemPos = n; } 604 605 const XubString& GetString() const { return maString; } 606 void SetString( const XubString& rStr ) { maString = rStr; } 607 608 const Image& GetImage() const { return maImage; } 609 void SetImage( const Image& rImg ) { maImage = rImg; } 610 611 sal_Bool SetModeImage( const Image& rImage, BmpColorMode eMode = BMP_COLOR_NORMAL ); 612 const Image& GetModeImage( BmpColorMode eMode = BMP_COLOR_NORMAL ) const; 613 614 615 virtual void MBDown(); 616 void SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; } 617 const Link& GetMBDownHdl() const { return maMBDownHdl; } 618 619 void SetUserDrawHdl( const Link& rLink ) { maUserDrawHdl = rLink; } 620 const Link& GetUserDrawHdl() const { return maUserDrawHdl; } 621 622 void SetUserItemSize( const Size& rSz ) { maUserItemSize = rSz; } 623 const Size& GetUserItemSize() const { return maUserItemSize; } 624 625 void EnableUserDraw( bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; } 626 bool IsUserDrawEnabled() const { return mbUserDrawEnabled; } 627 628 void DrawEntry( sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false ); 629 630 bool GetEdgeBlending() const { return mbEdgeBlending; } 631 void SetEdgeBlending(bool bNew) { mbEdgeBlending = bNew; } 632 }; 633 634 // ----------- 635 // - ImplBtn - 636 // ----------- 637 638 class ImplBtn : public PushButton 639 { 640 private: 641 sal_Bool mbDown; 642 643 Link maMBDownHdl; 644 645 public: 646 ImplBtn( Window* pParent, WinBits nWinStyle = 0 ); 647 ~ImplBtn() {}; 648 649 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 650 651 virtual void MBDown(); 652 void SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; } 653 const Link& GetMBDownHdl() const { return maMBDownHdl; } 654 }; 655 656 657 void ImplInitFieldSettings( Window* pWin, sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); 658 void ImplInitDropDownButton( PushButton* pButton ); 659 660 #endif // _SV_ILSTBOX_HXX 661