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 sal_Bool mbHasFocusRect: 1, 227 mbSort: 1, // ListBox sortiert 228 mbTrack: 1, // Tracking 229 mbMulti: 1, // MultiListBox 230 mbStackMode: 1, // StackSelection 231 mbSimpleMode: 1, // SimpleMode fuer MultiListBox 232 mbImgsDiffSz: 1, // Images haben verschiedene Groessen 233 mbTravelSelect: 1, // TravelSelect 234 mbTrackingSelect: 1, // Selektiert bei MouseMove 235 mbSelectionChanged: 1, // Select() nicht zu oft rufen... 236 mbMouseMoveSelect: 1, // Selektieren bei MouseMove 237 mbGrabFocus: 1, // Focus bei MBDown grabben 238 mbUserDrawEnabled: 1, // UserDraw possible 239 mbInUserDraw: 1, // In UserDraw 240 mbReadOnly: 1, // ReadOnly 241 mbMirroring: 1, // pb: #106948# explicit mirroring for calc 242 mbRight: 1, // right align Text output 243 mbCenter: 1; // center Text output 244 245 Link maScrollHdl; 246 Link maSelectHdl; 247 Link maCancelHdl; 248 Link maDoubleClickHdl; 249 Link maUserDrawHdl; 250 Link maMRUChangedHdl; 251 252 ::vcl::QuickSelectionEngine 253 maQuickSelectionEngine; 254 255 protected: 256 virtual void KeyInput( const KeyEvent& rKEvt ); 257 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 258 virtual void MouseMove( const MouseEvent& rMEvt ); 259 virtual void Tracking( const TrackingEvent& rTEvt ); 260 virtual void Paint( const Rectangle& rRect ); 261 virtual void Resize(); 262 virtual void GetFocus(); 263 virtual void LoseFocus(); 264 265 sal_Bool SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False ); 266 void ImplPaint( sal_uInt16 nPos, sal_Bool bErase = sal_False, bool bLayout = false ); 267 void ImplDoPaint( const Rectangle& rRect, bool bLayout = false ); 268 void ImplCalcMetrics(); 269 void ImplUpdateEntryMetrics( ImplEntryType& rEntry ); 270 void ImplCallSelect(); 271 272 void ImplShowFocusRect(); 273 void ImplHideFocusRect(); 274 275 276 virtual void StateChanged( StateChangedType nType ); 277 virtual void DataChanged( const DataChangedEvent& rDCEvt ); 278 279 public: 280 virtual void FillLayoutData() const; 281 282 ImplListBoxWindow( Window* pParent, WinBits nWinStyle ); 283 ~ImplListBoxWindow(); 284 285 ImplEntryList* GetEntryList() const { return mpEntryList; } 286 287 sal_uInt16 InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry ); 288 void RemoveEntry( sal_uInt16 nPos ); 289 void Clear(); 290 void ResetCurrentPos() { mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; } 291 sal_uInt16 GetCurrentPos() const { return mnCurrentPos; } 292 sal_uInt16 GetDisplayLineCount() const; 293 void SetEntryFlags( sal_uInt16 nPos, long nFlags ); 294 295 void DrawEntry( sal_uInt16 nPos, sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false ); 296 297 void SelectEntry( sal_uInt16 nPos, sal_Bool bSelect ); 298 void DeselectAll(); 299 sal_uInt16 GetEntryPosForPoint( const Point& rPoint ) const; 300 sal_uInt16 GetLastVisibleEntry() const; 301 302 sal_Bool ProcessKeyInput( const KeyEvent& rKEvt ); 303 304 void SetTopEntry( sal_uInt16 nTop ); 305 sal_uInt16 GetTopEntry() const { return mnTop; } 306 // ShowProminentEntry will set the entry correspoding to nEntryPos 307 // either at top or in the middle depending on the chosen style 308 void ShowProminentEntry( sal_uInt16 nEntryPos ); 309 void SetProminentEntryType( ProminentEntry eType ) { meProminentType = eType; } 310 ProminentEntry GetProminentEntryType() const { return meProminentType; } 311 using Window::IsVisible; 312 sal_Bool IsVisible( sal_uInt16 nEntry ) const; 313 314 long GetLeftIndent() const { return mnLeft; } 315 void SetLeftIndent( long n ); 316 void ScrollHorz( long nDiff ); 317 318 void AllowGrabFocus( sal_Bool b ) { mbGrabFocus = b; } 319 sal_Bool IsGrabFocusAllowed() const { return mbGrabFocus; } 320 321 void SetSeparatorPos( sal_uInt16 n ) { mnSeparatorPos = n; } 322 sal_uInt16 GetSeparatorPos() const { return mnSeparatorPos; } 323 324 void SetTravelSelect( sal_Bool bTravelSelect ) { mbTravelSelect = bTravelSelect; } 325 sal_Bool IsTravelSelect() const { return mbTravelSelect; } 326 sal_Bool IsTrackingSelect() const { return mbTrackingSelect; } 327 328 void SetUserItemSize( const Size& rSz ); 329 const Size& GetUserItemSize() const { return maUserItemSize; } 330 331 void EnableUserDraw( sal_Bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; } 332 sal_Bool IsUserDrawEnabled() const { return mbUserDrawEnabled; } 333 334 void EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { mbMulti = bMulti; mbStackMode = bStackMode; } 335 sal_Bool IsMultiSelectionEnabled() const { return mbMulti; } 336 337 void SetMultiSelectionSimpleMode( sal_Bool bSimple ) { mbSimpleMode = bSimple; } 338 sal_Bool IsMultiSelectionSimpleMode() const { return mbSimpleMode; } 339 340 void EnableMouseMoveSelect( sal_Bool bMouseMoveSelect ) { mbMouseMoveSelect = bMouseMoveSelect; } 341 sal_Bool IsMouseMoveSelectEnabled() const { return mbMouseMoveSelect; } 342 sal_Bool IsMouseMoveSelect() const { return mbMouseMoveSelect||mbStackMode; } 343 344 Size CalcSize( sal_uInt16 nMaxLines ) const; 345 Rectangle GetBoundingRectangle( sal_uInt16 nItem ) const; 346 347 long GetEntryHeight() const { return mnMaxHeight; } 348 long GetMaxEntryWidth() const { return mnMaxWidth; } 349 350 void SetScrollHdl( const Link& rLink ) { maScrollHdl = rLink; } 351 const Link& GetScrollHdl() const { return maScrollHdl; } 352 void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; } 353 const Link& GetSelectHdl() const { return maSelectHdl; } 354 void SetCancelHdl( const Link& rLink ) { maCancelHdl = rLink; } 355 const Link& GetCancelHdl() const { return maCancelHdl; } 356 void SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; } 357 const Link& GetDoubleClickHdl() const { return maDoubleClickHdl; } 358 void SetUserDrawHdl( const Link& rLink ) { maUserDrawHdl = rLink; } 359 const Link& GetUserDrawHdl() const { return maUserDrawHdl; } 360 void SetMRUChangedHdl( const Link& rLink ) { maMRUChangedHdl = rLink; } 361 const Link& GetMRUChangedHdl() const { return maMRUChangedHdl; } 362 363 sal_Bool IsSelectionChanged() const { return mbSelectionChanged; } 364 sal_uInt16 GetSelectModifier() const { return mnSelectModifier; } 365 366 void EnableSort( sal_Bool b ) { mbSort = b; } 367 368 void SetReadOnly( sal_Bool bReadOnly ) { mbReadOnly = bReadOnly; } 369 sal_Bool IsReadOnly() const { return mbReadOnly; } 370 371 using Control::ImplInitSettings; 372 void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); 373 sal_uInt16 ImplGetTextStyle() const; 374 375 // pb: #106948# explicit mirroring for calc 376 inline void EnableMirroring() { mbMirroring = sal_True; } 377 inline sal_Bool IsMirroring() const { return mbMirroring; } 378 379 protected: 380 // ISearchableStringList 381 virtual ::vcl::StringEntryIdentifier CurrentEntry( String& _out_entryText ) const; 382 virtual ::vcl::StringEntryIdentifier NextEntry( ::vcl::StringEntryIdentifier _currentEntry, String& _out_entryText ) const; 383 virtual void SelectEntry( ::vcl::StringEntryIdentifier _entry ); 384 }; 385 386 // --------------- 387 // - ImplListBox - 388 // --------------- 389 390 class ImplListBox : public Control 391 { 392 private: 393 ImplListBoxWindow maLBWindow; 394 ScrollBar* mpHScrollBar; 395 ScrollBar* mpVScrollBar; 396 ScrollBarBox* mpScrollBarBox; 397 sal_Bool mbVScroll : 1, // VScroll an oder aus 398 mbHScroll : 1, // HScroll an oder aus 399 mbAutoHScroll : 1; // AutoHScroll an oder aus 400 Link maScrollHdl; // Weil der vom ImplListBoxWindow selbst benoetigt wird. 401 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxDNDListenerContainer; 402 403 protected: 404 virtual void GetFocus(); 405 virtual void StateChanged( StateChangedType nType ); 406 virtual void DataChanged( const DataChangedEvent& rDCEvt ); 407 408 long Notify( NotifyEvent& rNEvt ); 409 410 void ImplResizeControls(); 411 void ImplCheckScrollBars(); 412 void ImplInitScrollBars(); 413 414 DECL_LINK( ScrollBarHdl, ScrollBar* ); 415 DECL_LINK( LBWindowScrolled, void* ); 416 DECL_LINK( MRUChanged, void* ); 417 418 public: 419 ImplListBox( Window* pParent, WinBits nWinStyle ); 420 ~ImplListBox(); 421 422 const ImplEntryList* GetEntryList() const { return maLBWindow.GetEntryList(); } 423 ImplListBoxWindow* GetMainWindow() { return &maLBWindow; } 424 425 virtual void Resize(); 426 virtual const Wallpaper& GetDisplayBackground() const; 427 virtual Window* GetPreferredKeyInputWindow(); 428 429 sal_uInt16 InsertEntry( sal_uInt16 nPos, const XubString& rStr ); 430 sal_uInt16 InsertEntry( sal_uInt16 nPos, const Image& rImage ); 431 sal_uInt16 InsertEntry( sal_uInt16 nPos, const XubString& rStr, const Image& rImage ); 432 void RemoveEntry( sal_uInt16 nPos ); 433 void SetEntryData( sal_uInt16 nPos, void* pNewData ) { maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); } 434 void Clear(); 435 436 void SetEntryFlags( sal_uInt16 nPos, long nFlags ); 437 long GetEntryFlags( sal_uInt16 nPos ) const; 438 439 void SelectEntry( sal_uInt16 nPos, sal_Bool bSelect ); 440 void SetNoSelection(); 441 void ResetCurrentPos() { maLBWindow.ResetCurrentPos(); } 442 sal_uInt16 GetCurrentPos() const { return maLBWindow.GetCurrentPos(); } 443 444 sal_Bool ProcessKeyInput( const KeyEvent& rKEvt ) { return maLBWindow.ProcessKeyInput( rKEvt ); } 445 sal_Bool HandleWheelAsCursorTravel( const CommandEvent& rCEvt ); 446 447 void SetSeparatorPos( sal_uInt16 n ) { maLBWindow.SetSeparatorPos( n ); } 448 sal_uInt16 GetSeparatorPos() const { return maLBWindow.GetSeparatorPos(); } 449 450 void SetTopEntry( sal_uInt16 nTop ) { maLBWindow.SetTopEntry( nTop ); } 451 sal_uInt16 GetTopEntry() const { return maLBWindow.GetTopEntry(); } 452 void ShowProminentEntry( sal_uInt16 nPos ) { maLBWindow.ShowProminentEntry( nPos ); } 453 using Window::IsVisible; 454 sal_Bool IsVisible( sal_uInt16 nEntry ) const { return maLBWindow.IsVisible( nEntry ); } 455 456 void SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); } 457 ProminentEntry GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); } 458 459 long GetLeftIndent() const { return maLBWindow.GetLeftIndent(); } 460 void SetLeftIndent( sal_uInt16 n ) { maLBWindow.SetLeftIndent( n ); } 461 void ScrollHorz( short nDiff ) { maLBWindow.ScrollHorz( nDiff ); } 462 463 void SetTravelSelect( sal_Bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); } 464 sal_Bool IsTravelSelect() const { return maLBWindow.IsTravelSelect(); } 465 sal_Bool IsTrackingSelect() const { return maLBWindow.IsTrackingSelect(); } 466 467 void EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); } 468 sal_Bool IsMultiSelectionEnabled() const { return maLBWindow.IsMultiSelectionEnabled(); } 469 470 void SetMultiSelectionSimpleMode( sal_Bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); } 471 sal_Bool IsMultiSelectionSimpleMode() const { return maLBWindow.IsMultiSelectionSimpleMode(); } 472 473 void SetReadOnly( sal_Bool b ) { maLBWindow.SetReadOnly( b ); } 474 sal_Bool IsReadOnly() const { return maLBWindow.IsReadOnly(); } 475 476 477 Size CalcSize( sal_uInt16 nMaxLines ) const { return maLBWindow.CalcSize( nMaxLines ); } 478 long GetEntryHeight() const { return maLBWindow.GetEntryHeight(); } 479 long GetMaxEntryWidth() const { return maLBWindow.GetMaxEntryWidth(); } 480 481 void SetScrollHdl( const Link& rLink ) { maScrollHdl = rLink; } 482 const Link& GetScrollHdl() const { return maScrollHdl; } 483 void SetSelectHdl( const Link& rLink ) { maLBWindow.SetSelectHdl( rLink ); } 484 const Link& GetSelectHdl() const { return maLBWindow.GetSelectHdl(); } 485 void SetCancelHdl( const Link& rLink ) { maLBWindow.SetCancelHdl( rLink ); } 486 const Link& GetCancelHdl() const { return maLBWindow.GetCancelHdl(); } 487 void SetDoubleClickHdl( const Link& rLink ) { maLBWindow.SetDoubleClickHdl( rLink ); } 488 const Link& GetDoubleClickHdl() const { return maLBWindow.GetDoubleClickHdl(); } 489 void SetUserDrawHdl( const Link& rLink ) { maLBWindow.SetUserDrawHdl( rLink ); } 490 const Link& GetUserDrawHdl() const { return maLBWindow.GetUserDrawHdl(); } 491 492 void SetSelectionChangedHdl( const Link& rLnk ) { maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); } 493 void SetCallSelectionChangedHdl( sal_Bool bCall ) { maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); } 494 sal_Bool IsSelectionChanged() const { return maLBWindow.IsSelectionChanged(); } 495 sal_uInt16 GetSelectModifier() const { return maLBWindow.GetSelectModifier(); } 496 497 void SetMRUEntries( const XubString& rEntries, xub_Unicode cSep ); 498 XubString GetMRUEntries( xub_Unicode cSep ) const; 499 void SetMaxMRUCount( sal_uInt16 n ) { maLBWindow.GetEntryList()->SetMaxMRUCount( n ); } 500 sal_uInt16 GetMaxMRUCount() const { return maLBWindow.GetEntryList()->GetMaxMRUCount(); } 501 sal_uInt16 GetDisplayLineCount() const 502 { return maLBWindow.GetDisplayLineCount(); } 503 504 // pb: #106948# explicit mirroring for calc 505 inline void EnableMirroring() { maLBWindow.EnableMirroring(); } 506 inline void SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; } 507 }; 508 509 // ----------------------------- 510 // - ImplListBoxFloatingWindow - 511 // ----------------------------- 512 513 class ImplListBoxFloatingWindow : public FloatingWindow 514 { 515 private: 516 ImplListBox* mpImplLB; 517 Size maPrefSz; 518 sal_uInt16 mnDDLineCount; 519 sal_uInt16 mnPopupModeStartSaveSelection; 520 sal_Bool mbAutoWidth; 521 522 protected: 523 long PreNotify( NotifyEvent& rNEvt ); 524 525 public: 526 ImplListBoxFloatingWindow( Window* pParent ); 527 528 void SetImplListBox( ImplListBox* pLB ) { mpImplLB = pLB; } 529 530 void SetPrefSize( const Size& rSz ) { maPrefSz = rSz; } 531 const Size& GetPrefSize() const { return maPrefSz; } 532 533 void SetAutoWidth( sal_Bool b ) { mbAutoWidth = b; } 534 sal_Bool IsAutoWidth() const { return mbAutoWidth; } 535 536 Size CalcFloatSize(); 537 void StartFloat( sal_Bool bStartTracking ); 538 539 virtual void SetPosSizePixel( long nX, long nY, 540 long nWidth, long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL ); 541 void SetPosSizePixel( const Point& rNewPos, const Size& rNewSize ) 542 { FloatingWindow::SetPosSizePixel( rNewPos, rNewSize ); } 543 544 void SetDropDownLineCount( sal_uInt16 n ) { mnDDLineCount = n; } 545 sal_uInt16 GetDropDownLineCount() const { return mnDDLineCount; } 546 547 sal_uInt16 GetPopupModeStartSaveSelection() const { return mnPopupModeStartSaveSelection; } 548 549 virtual void Resize(); 550 }; 551 552 // ----------- 553 // - ImplWin - 554 // ----------- 555 556 class ImplWin : public Control 557 { 558 private: 559 560 sal_uInt16 mnItemPos; // wegen UserDraw muss ich wissen, welches Item ich darstelle. 561 XubString maString; 562 Image maImage; 563 Image maImageHC; 564 565 Rectangle maFocusRect; 566 Size maUserItemSize; 567 568 Link maMBDownHdl; 569 Link maUserDrawHdl; 570 571 sal_Bool mbUserDrawEnabled : 1, 572 mbInUserDraw : 1; 573 574 575 void ImplDraw( bool bLayout = false ); 576 protected: 577 virtual void FillLayoutData() const; 578 public: 579 580 ImplWin( Window* pParent, WinBits nWinStyle = 0 ); 581 ~ImplWin() {}; 582 583 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 584 virtual void Paint( const Rectangle& rRect ); 585 virtual void Resize(); 586 virtual void GetFocus(); 587 virtual void LoseFocus(); 588 virtual long PreNotify( NotifyEvent& rNEvt ); 589 590 sal_uInt16 GetItemPos() const { return mnItemPos; } 591 void SetItemPos( sal_uInt16 n ) { mnItemPos = n; } 592 593 const XubString& GetString() const { return maString; } 594 void SetString( const XubString& rStr ) { maString = rStr; } 595 596 const Image& GetImage() const { return maImage; } 597 void SetImage( const Image& rImg ) { maImage = rImg; } 598 599 sal_Bool SetModeImage( const Image& rImage, BmpColorMode eMode = BMP_COLOR_NORMAL ); 600 const Image& GetModeImage( BmpColorMode eMode = BMP_COLOR_NORMAL ) const; 601 602 603 virtual void MBDown(); 604 void SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; } 605 const Link& GetMBDownHdl() const { return maMBDownHdl; } 606 607 void SetUserDrawHdl( const Link& rLink ) { maUserDrawHdl = rLink; } 608 const Link& GetUserDrawHdl() const { return maUserDrawHdl; } 609 610 void SetUserItemSize( const Size& rSz ) { maUserItemSize = rSz; } 611 const Size& GetUserItemSize() const { return maUserItemSize; } 612 613 void EnableUserDraw( sal_Bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; } 614 sal_Bool IsUserDrawEnabled() const { return mbUserDrawEnabled; } 615 616 void DrawEntry( sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false ); 617 }; 618 619 // ----------- 620 // - ImplBtn - 621 // ----------- 622 623 class ImplBtn : public PushButton 624 { 625 private: 626 sal_Bool mbDown; 627 628 Link maMBDownHdl; 629 630 public: 631 ImplBtn( Window* pParent, WinBits nWinStyle = 0 ); 632 ~ImplBtn() {}; 633 634 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 635 636 virtual void MBDown(); 637 void SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; } 638 const Link& GetMBDownHdl() const { return maMBDownHdl; } 639 }; 640 641 642 void ImplInitFieldSettings( Window* pWin, sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); 643 void ImplInitDropDownButton( PushButton* pButton ); 644 645 #endif // _SV_ILSTBOX_HXX 646