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