xref: /AOO41X/main/svtools/source/contnr/svlbitm.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svtools.hxx"
26 
27 
28 #include <svtools/svlbox.hxx>
29 #include <svtools/svlbitm.hxx>
30 #include <vcl/svapp.hxx>
31 #ifndef _SV_BUTTON_HXX
32 #include <vcl/button.hxx>
33 #endif
34 #include <vcl/decoview.hxx>
35 #include <vcl/sound.hxx>
36 #include <vcl/salnativewidgets.hxx>
37 
38 #define TABOFFS_NOT_VALID -2000000
39 
40 struct SvLBoxButtonData_Impl
41 {
42     SvLBoxEntry*    pEntry;
43     sal_Bool            bDefaultImages;
44     sal_Bool            bShowRadioButton;
45 
SvLBoxButtonData_ImplSvLBoxButtonData_Impl46     SvLBoxButtonData_Impl() : pEntry( NULL ), bDefaultImages( sal_False ), bShowRadioButton( sal_False ) {}
47 };
48 
49 
DBG_NAME(SvLBoxButtonData)50 DBG_NAME(SvLBoxButtonData)
51 
52 void SvLBoxButtonData::InitData( sal_Bool bImagesFromDefault, bool _bRadioBtn, const Control* pCtrl )
53 {
54     pImpl = new SvLBoxButtonData_Impl;
55 
56     bDataOk = sal_False;
57     eState = SV_BUTTON_UNCHECKED;
58     pImpl->bDefaultImages = bImagesFromDefault;
59     pImpl->bShowRadioButton = ( _bRadioBtn != false );
60 
61     if ( bImagesFromDefault )
62         SetDefaultImages( pCtrl );
63 }
64 
SvLBoxButtonData(const Control * pControlForSettings)65 SvLBoxButtonData::SvLBoxButtonData( const Control* pControlForSettings )
66 {
67     DBG_CTOR(SvLBoxButtonData,0);
68 
69     InitData( sal_True, false, pControlForSettings );
70 }
71 
SvLBoxButtonData(const Control * pControlForSettings,bool _bRadioBtn)72 SvLBoxButtonData::SvLBoxButtonData( const Control* pControlForSettings, bool _bRadioBtn )
73 {
74     DBG_CTOR(SvLBoxButtonData,0);
75 
76     InitData( sal_True, _bRadioBtn, pControlForSettings );
77 }
78 
SvLBoxButtonData()79 SvLBoxButtonData::SvLBoxButtonData()
80 {
81     DBG_CTOR(SvLBoxButtonData,0);
82 
83     InitData( sal_False, false );
84 }
85 
~SvLBoxButtonData()86 SvLBoxButtonData::~SvLBoxButtonData()
87 {
88     DBG_DTOR(SvLBoxButtonData,0);
89 
90     delete pImpl;
91 #ifdef DBG_UTIL
92     pImpl = NULL;
93 #endif
94 }
95 
CallLink()96 void SvLBoxButtonData::CallLink()
97 {
98     DBG_CHKTHIS(SvLBoxButtonData,0);
99     aLink.Call( this );
100 }
101 
GetIndex(sal_uInt16 nItemState)102 sal_uInt16 SvLBoxButtonData::GetIndex( sal_uInt16 nItemState )
103 {
104     DBG_CHKTHIS(SvLBoxButtonData,0);
105     nItemState &= 0x000F;
106     sal_uInt16 nIdx;
107     switch( nItemState )
108     {
109         case SV_ITEMSTATE_UNCHECKED:
110                 nIdx = SV_BMP_UNCHECKED; break;
111         case SV_ITEMSTATE_CHECKED:
112                 nIdx = SV_BMP_CHECKED; break;
113         case SV_ITEMSTATE_TRISTATE:
114                 nIdx = SV_BMP_TRISTATE; break;
115         case SV_ITEMSTATE_UNCHECKED | SV_ITEMSTATE_HILIGHTED:
116                 nIdx = SV_BMP_HIUNCHECKED; break;
117         case SV_ITEMSTATE_CHECKED | SV_ITEMSTATE_HILIGHTED:
118                 nIdx = SV_BMP_HICHECKED; break;
119         case SV_ITEMSTATE_TRISTATE | SV_ITEMSTATE_HILIGHTED:
120                 nIdx = SV_BMP_HITRISTATE; break;
121         default:
122                 nIdx = SV_BMP_UNCHECKED;
123     }
124     return nIdx;
125 }
126 
SetWidthAndHeight()127 void SvLBoxButtonData::SetWidthAndHeight()
128 {
129     DBG_CHKTHIS(SvLBoxButtonData,0);
130     Size aSize = aBmps[0].GetSizePixel();
131     nWidth = aSize.Width();
132     nHeight = aSize.Height();
133     bDataOk = sal_True;
134 }
135 
136 
StoreButtonState(SvLBoxEntry * pActEntry,sal_uInt16 nItemFlags)137 void SvLBoxButtonData::StoreButtonState( SvLBoxEntry* pActEntry, sal_uInt16 nItemFlags )
138 {
139     DBG_CHKTHIS(SvLBoxButtonData,0);
140     pImpl->pEntry = pActEntry;
141     eState = ConvertToButtonState( nItemFlags );
142 }
143 
ConvertToButtonState(sal_uInt16 nItemFlags) const144 SvButtonState SvLBoxButtonData::ConvertToButtonState( sal_uInt16 nItemFlags ) const
145 {
146     DBG_CHKTHIS(SvLBoxButtonData,0);
147     nItemFlags &= (SV_ITEMSTATE_UNCHECKED |
148                    SV_ITEMSTATE_CHECKED |
149                    SV_ITEMSTATE_TRISTATE);
150     switch( nItemFlags )
151     {
152         case SV_ITEMSTATE_UNCHECKED:
153             return SV_BUTTON_UNCHECKED;
154 
155         case SV_ITEMSTATE_CHECKED:
156             return SV_BUTTON_CHECKED;
157 
158         case SV_ITEMSTATE_TRISTATE:
159             return SV_BUTTON_TRISTATE;
160         default:
161             return SV_BUTTON_UNCHECKED;
162     }
163 }
164 
GetActEntry() const165 SvLBoxEntry* SvLBoxButtonData::GetActEntry() const
166 {
167     DBG_ASSERT( pImpl, "-SvLBoxButtonData::GetActEntry(): don't use me that way!" );
168     return pImpl->pEntry;
169 }
170 
SetDefaultImages(const Control * pCtrl)171 void SvLBoxButtonData::SetDefaultImages( const Control* pCtrl )
172 {
173     const AllSettings& rSettings = pCtrl? pCtrl->GetSettings() : Application::GetSettings();
174 
175     if ( pImpl->bShowRadioButton )
176     {
177         aBmps[ SV_BMP_UNCHECKED ]   = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DEFAULT );
178         aBmps[ SV_BMP_CHECKED ]     = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_CHECKED );
179         aBmps[ SV_BMP_HICHECKED ]   = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_CHECKED | BUTTON_DRAW_PRESSED );
180         aBmps[ SV_BMP_HIUNCHECKED ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DEFAULT | BUTTON_DRAW_PRESSED );
181         aBmps[ SV_BMP_TRISTATE ]    = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DONTKNOW );
182         aBmps[ SV_BMP_HITRISTATE ]  = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DONTKNOW | BUTTON_DRAW_PRESSED );
183     }
184     else
185     {
186         aBmps[ SV_BMP_UNCHECKED ]   = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DEFAULT );
187         aBmps[ SV_BMP_CHECKED ]     = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_CHECKED );
188         aBmps[ SV_BMP_HICHECKED ]   = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_CHECKED | BUTTON_DRAW_PRESSED );
189         aBmps[ SV_BMP_HIUNCHECKED ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DEFAULT | BUTTON_DRAW_PRESSED );
190         aBmps[ SV_BMP_TRISTATE ]    = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DONTKNOW );
191         aBmps[ SV_BMP_HITRISTATE ]  = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DONTKNOW | BUTTON_DRAW_PRESSED );
192     }
193 }
194 
HasDefaultImages(void) const195 sal_Bool SvLBoxButtonData::HasDefaultImages( void ) const
196 {
197     return pImpl->bDefaultImages;
198 }
199 
IsRadio()200 sal_Bool SvLBoxButtonData::IsRadio() {
201     return pImpl->bShowRadioButton;
202 }
203 
204 // ***************************************************************
205 // class SvLBoxString
206 // ***************************************************************
207 
208 DBG_NAME(SvLBoxString);
209 
SvLBoxString(SvLBoxEntry * pEntry,sal_uInt16 nFlags,const XubString & rStr)210 SvLBoxString::SvLBoxString( SvLBoxEntry* pEntry,sal_uInt16 nFlags,const XubString& rStr) :
211         SvLBoxItem( pEntry, nFlags )
212 {
213     DBG_CTOR(SvLBoxString,0);
214     SetText( pEntry, rStr );
215 }
216 
SvLBoxString()217 SvLBoxString::SvLBoxString() : SvLBoxItem()
218 {
219     DBG_CTOR(SvLBoxString,0);
220 }
221 
~SvLBoxString()222 SvLBoxString::~SvLBoxString()
223 {
224     DBG_DTOR(SvLBoxString,0);
225 }
226 
IsA()227 sal_uInt16 SvLBoxString::IsA()
228 {
229     DBG_CHKTHIS(SvLBoxString,0);
230     return SV_ITEM_ID_LBOXSTRING;
231 }
232 
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry * _pEntry)233 void SvLBoxString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */,
234     SvLBoxEntry* _pEntry)
235 {
236     DBG_CHKTHIS(SvLBoxString,0);
237     if ( _pEntry )
238     {
239         sal_uInt16 nStyle = rDev.IsEnabled() ? 0 : TEXT_DRAW_DISABLE;
240         if ( rDev.IsEntryMnemonicsEnabled() )
241             nStyle |= TEXT_DRAW_MNEMONIC;
242         rDev.DrawText( Rectangle(rPos,GetSize(&rDev,_pEntry)),aStr,nStyle);
243     }
244     else
245         rDev.DrawText( rPos, aStr);
246 
247 }
248 
Create() const249 SvLBoxItem* SvLBoxString::Create() const
250 {
251     DBG_CHKTHIS(SvLBoxString,0);
252     return new SvLBoxString;
253 }
254 
Clone(SvLBoxItem * pSource)255 void SvLBoxString::Clone( SvLBoxItem* pSource )
256 {
257     DBG_CHKTHIS(SvLBoxString,0);
258     aStr = ((SvLBoxString*)pSource)->aStr;
259 }
260 
SetText(SvLBoxEntry *,const XubString & rStr)261 void SvLBoxString::SetText( SvLBoxEntry*, const XubString& rStr )
262 {
263     DBG_CHKTHIS(SvLBoxString,0);
264     aStr = rStr;
265 }
266 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)267 void SvLBoxString::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
268     SvViewDataItem* pViewData)
269 {
270     DBG_CHKTHIS(SvLBoxString,0);
271     if( !pViewData )
272         pViewData = pView->GetViewDataItem( pEntry, this );
273     pViewData->aSize = Size(pView->GetTextWidth( aStr ), pView->GetTextHeight());
274 }
275 
276 // ***************************************************************
277 // class SvLBoxBmp
278 // ***************************************************************
279 
280 DBG_NAME(SvLBoxBmp);
281 
SvLBoxBmp(SvLBoxEntry * pEntry,sal_uInt16 nFlags,Image aBitmap)282 SvLBoxBmp::SvLBoxBmp( SvLBoxEntry* pEntry, sal_uInt16 nFlags, Image aBitmap ) :
283     SvLBoxItem( pEntry, nFlags )
284 {
285     DBG_CTOR(SvLBoxBmp,0);
286     SetBitmap( pEntry, aBitmap);
287 }
288 
SvLBoxBmp()289 SvLBoxBmp::SvLBoxBmp() : SvLBoxItem()
290 {
291     DBG_CTOR(SvLBoxBmp,0);
292 }
293 
~SvLBoxBmp()294 SvLBoxBmp::~SvLBoxBmp()
295 {
296     DBG_DTOR(SvLBoxBmp,0);
297 }
298 
IsA()299 sal_uInt16 SvLBoxBmp::IsA()
300 {
301     DBG_CHKTHIS(SvLBoxBmp,0);
302     return SV_ITEM_ID_LBOXBMP;
303 }
304 
SetBitmap(SvLBoxEntry *,Image aBitmap)305 void SvLBoxBmp::SetBitmap( SvLBoxEntry*, Image aBitmap)
306 {
307     DBG_CHKTHIS(SvLBoxBmp,0);
308     aBmp = aBitmap;
309 }
310 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)311 void SvLBoxBmp::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
312     SvViewDataItem* pViewData)
313 {
314     DBG_CHKTHIS(SvLBoxBmp,0);
315     if( !pViewData )
316         pViewData = pView->GetViewDataItem( pEntry, this );
317     pViewData->aSize = aBmp.GetSizePixel();
318 }
319 
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry *)320 void SvLBoxBmp::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */,
321                         SvLBoxEntry* )
322 {
323     DBG_CHKTHIS(SvLBoxBmp,0);
324     sal_uInt16 nStyle = rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE;
325     rDev.DrawImage( rPos, aBmp ,nStyle);
326 }
327 
Create() const328 SvLBoxItem* SvLBoxBmp::Create() const
329 {
330     DBG_CHKTHIS(SvLBoxBmp,0);
331     return new SvLBoxBmp;
332 }
333 
Clone(SvLBoxItem * pSource)334 void SvLBoxBmp::Clone( SvLBoxItem* pSource )
335 {
336     DBG_CHKTHIS(SvLBoxBmp,0);
337     aBmp = ((SvLBoxBmp*)pSource)->aBmp;
338 }
339 
340 // ***************************************************************
341 // class SvLBoxButton
342 // ***************************************************************
343 
344 DBG_NAME(SvLBoxButton);
345 
SvLBoxButton(SvLBoxEntry * pEntry,SvLBoxButtonKind eTheKind,sal_uInt16 nFlags,SvLBoxButtonData * pBData)346 SvLBoxButton::SvLBoxButton( SvLBoxEntry* pEntry, SvLBoxButtonKind eTheKind,
347                             sal_uInt16 nFlags, SvLBoxButtonData* pBData )
348     : SvLBoxItem( pEntry, nFlags )
349 {
350     DBG_CTOR(SvLBoxButton,0);
351     eKind = eTheKind;
352     nBaseOffs = 0;
353     nItemFlags = 0;
354     SetStateUnchecked();
355     pData = pBData;
356 }
357 
SvLBoxButton()358 SvLBoxButton::SvLBoxButton() : SvLBoxItem()
359 {
360     DBG_CTOR(SvLBoxButton,0);
361     eKind = SvLBoxButtonKind_enabledCheckbox;
362     nItemFlags = 0;
363     SetStateUnchecked();
364 }
365 
~SvLBoxButton()366 SvLBoxButton::~SvLBoxButton()
367 {
368     DBG_DTOR(SvLBoxButton,0);
369 }
370 
IsA()371 sal_uInt16 SvLBoxButton::IsA()
372 {
373     DBG_CHKTHIS(SvLBoxButton,0);
374     return SV_ITEM_ID_LBOXBUTTON;
375 }
376 
Check(SvLBox *,SvLBoxEntry *,sal_Bool bOn)377 void SvLBoxButton::Check(SvLBox*, SvLBoxEntry*, sal_Bool bOn)
378 {
379     DBG_CHKTHIS(SvLBoxButton,0);
380     if ( bOn != IsStateChecked() )
381     {
382         if ( bOn )
383             SetStateChecked();
384         else
385             SetStateUnchecked();
386     }
387 }
388 
ClickHdl(SvLBox *,SvLBoxEntry * pEntry)389 sal_Bool SvLBoxButton::ClickHdl( SvLBox*, SvLBoxEntry* pEntry )
390 {
391     DBG_CHKTHIS(SvLBoxButton,0);
392     if ( CheckModification() )
393     {
394         if ( IsStateChecked() )
395             SetStateUnchecked();
396         else
397             SetStateChecked();
398         pData->StoreButtonState( pEntry, nItemFlags );
399         pData->CallLink();
400     }
401     return sal_False;
402 }
403 
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry *)404 void SvLBoxButton::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */,
405                             SvLBoxEntry* /*pEntry*/ )
406 {
407     DBG_CHKTHIS(SvLBoxButton,0);
408     sal_uInt16 nIndex = eKind == SvLBoxButtonKind_staticImage
409         ? SV_BMP_STATICIMAGE : pData->GetIndex( nItemFlags );
410     sal_uInt16 nStyle = eKind != SvLBoxButtonKind_disabledCheckbox &&
411         rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE;
412 
413 ///
414 //Native drawing
415 ///
416     sal_Bool bNativeOK = sal_False;
417     ControlType eCtrlType = (pData->IsRadio())? CTRL_RADIOBUTTON : CTRL_CHECKBOX;
418     if ( nIndex != SV_BMP_STATICIMAGE && rDev.IsNativeControlSupported( eCtrlType, PART_ENTIRE_CONTROL) )
419     {
420         Size aSize(pData->Width(), pData->Height());
421         ImplAdjustBoxSize( aSize, eCtrlType, &rDev );
422         ImplControlValue    aControlValue;
423         Rectangle           aCtrlRegion( rPos, aSize );
424         ControlState        nState = 0;
425 
426         //states CTRL_STATE_DEFAULT, CTRL_STATE_PRESSED and CTRL_STATE_ROLLOVER are not implemented
427         if ( IsStateHilighted() )                   nState |= CTRL_STATE_FOCUSED;
428         if ( nStyle != IMAGE_DRAW_DISABLE )         nState |= CTRL_STATE_ENABLED;
429 
430         if ( IsStateChecked() )
431             aControlValue.setTristateVal( BUTTONVALUE_ON );
432         else if ( IsStateUnchecked() )
433             aControlValue.setTristateVal( BUTTONVALUE_OFF );
434         else if ( IsStateTristate() )
435             aControlValue.setTristateVal( BUTTONVALUE_MIXED );
436 
437         bNativeOK = rDev.DrawNativeControl( eCtrlType, PART_ENTIRE_CONTROL,
438                                 aCtrlRegion, nState, aControlValue, rtl::OUString() );
439     }
440 
441     if( !bNativeOK)
442         rDev.DrawImage( rPos, pData->aBmps[nIndex + nBaseOffs] ,nStyle);
443 }
444 
Create() const445 SvLBoxItem* SvLBoxButton::Create() const
446 {
447     DBG_CHKTHIS(SvLBoxButton,0);
448     return new SvLBoxButton;
449 }
450 
Clone(SvLBoxItem * pSource)451 void SvLBoxButton::Clone( SvLBoxItem* pSource )
452 {
453     DBG_CHKTHIS(SvLBoxButton,0);
454     pData = ((SvLBoxButton*)pSource)->pData;
455 }
456 
ImplAdjustBoxSize(Size & io_rSize,ControlType i_eType,Window * i_pParent)457 void SvLBoxButton::ImplAdjustBoxSize( Size& io_rSize, ControlType i_eType, Window* i_pParent )
458 {
459     if ( i_pParent->IsNativeControlSupported( i_eType, PART_ENTIRE_CONTROL) )
460     {
461         ImplControlValue    aControlValue;
462         Rectangle           aCtrlRegion( Point( 0, 0 ), io_rSize );
463         ControlState        nState = CTRL_STATE_ENABLED;
464 
465         aControlValue.setTristateVal( BUTTONVALUE_ON );
466 
467         Rectangle aNativeBounds, aNativeContent;
468         bool bNativeOK = i_pParent->GetNativeControlRegion( i_eType,
469                                                             PART_ENTIRE_CONTROL,
470                                                             aCtrlRegion,
471                                                             nState,
472                                                             aControlValue,
473                                                             rtl::OUString(),
474                                                             aNativeBounds,
475                                                             aNativeContent );
476         if( bNativeOK )
477         {
478             Size aContentSize( aNativeContent.GetSize() );
479             // leave a little space around the box image (looks better
480             if( aContentSize.Height() + 2 > io_rSize.Height() )
481                 io_rSize.Height() = aContentSize.Height() + 2;
482         }
483     }
484 }
485 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)486 void SvLBoxButton::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
487     SvViewDataItem* pViewData )
488 {
489     DBG_CHKTHIS(SvLBoxButton,0);
490     if( !pViewData )
491         pViewData = pView->GetViewDataItem( pEntry, this );
492     Size aSize( pData->Width(), pData->Height() );
493 
494     ControlType eCtrlType = (pData->IsRadio())? CTRL_RADIOBUTTON : CTRL_CHECKBOX;
495     if ( eKind != SvLBoxButtonKind_staticImage && pView )
496         ImplAdjustBoxSize( aSize, eCtrlType, pView );
497     pViewData->aSize = aSize;
498 }
499 
CheckModification() const500 bool SvLBoxButton::CheckModification() const
501 {
502     if( eKind == SvLBoxButtonKind_disabledCheckbox )
503         Sound::Beep();
504     return eKind == SvLBoxButtonKind_enabledCheckbox;
505 }
506 
507 // ***************************************************************
508 // class SvLBoxContextBmp
509 // ***************************************************************
510 
511 struct SvLBoxContextBmp_Impl
512 {
513     Image       m_aImage1;
514     Image       m_aImage2;
515 
516     Image       m_aImage1_hc;
517     Image       m_aImage2_hc;
518 
519     sal_uInt16      m_nB2IndicatorFlags;
520 };
521 
522 // ***************************************************************
DBG_NAME(SvLBoxContextBmp)523 DBG_NAME(SvLBoxContextBmp)
524 
525 SvLBoxContextBmp::SvLBoxContextBmp( SvLBoxEntry* pEntry, sal_uInt16 nItemFlags,
526     Image aBmp1, Image aBmp2, sal_uInt16 nEntryFlags )
527     :SvLBoxItem( pEntry, nItemFlags )
528     ,m_pImpl( new SvLBoxContextBmp_Impl )
529 {
530     DBG_CTOR(SvLBoxContextBmp,0);
531 
532     m_pImpl->m_nB2IndicatorFlags = nEntryFlags;
533     SetModeImages( aBmp1, aBmp2 );
534 }
535 
SvLBoxContextBmp()536 SvLBoxContextBmp::SvLBoxContextBmp()
537     :SvLBoxItem( )
538     ,m_pImpl( new SvLBoxContextBmp_Impl )
539 {
540     m_pImpl->m_nB2IndicatorFlags = 0;
541     DBG_CTOR(SvLBoxContextBmp,0);
542 }
543 
~SvLBoxContextBmp()544 SvLBoxContextBmp::~SvLBoxContextBmp()
545 {
546     delete m_pImpl;
547     DBG_DTOR(SvLBoxContextBmp,0);
548 }
549 
IsA()550 sal_uInt16 SvLBoxContextBmp::IsA()
551 {
552     DBG_CHKTHIS(SvLBoxContextBmp,0);
553     return SV_ITEM_ID_LBOXCONTEXTBMP;
554 }
555 
SetModeImages(const Image & _rBitmap1,const Image & _rBitmap2,BmpColorMode _eMode)556 sal_Bool SvLBoxContextBmp::SetModeImages( const Image& _rBitmap1, const Image& _rBitmap2, BmpColorMode _eMode )
557 {
558     DBG_CHKTHIS(SvLBoxContextBmp,0);
559 
560     sal_Bool bSuccess = sal_True;
561     switch ( _eMode )
562     {
563         case BMP_COLOR_NORMAL:
564             m_pImpl->m_aImage1 = _rBitmap1;
565             m_pImpl->m_aImage2 = _rBitmap2;
566             break;
567 
568         case BMP_COLOR_HIGHCONTRAST:
569             m_pImpl->m_aImage1_hc = _rBitmap1;
570             m_pImpl->m_aImage2_hc = _rBitmap2;
571             break;
572 
573         default:
574             DBG_ERROR( "SvLBoxContextBmp::SetModeImages: unexpected mode!");
575             bSuccess = sal_False;
576             break;
577     }
578     return bSuccess;
579 }
580 
implGetImageStore(sal_Bool _bFirst,BmpColorMode _eMode)581 Image& SvLBoxContextBmp::implGetImageStore( sal_Bool _bFirst, BmpColorMode _eMode )
582 {
583     DBG_CHKTHIS(SvLBoxContextBmp,0);
584 
585     switch ( _eMode )
586     {
587         case BMP_COLOR_NORMAL:
588             return _bFirst ? m_pImpl->m_aImage1 : m_pImpl->m_aImage2;
589 
590         case BMP_COLOR_HIGHCONTRAST:
591             return _bFirst ? m_pImpl->m_aImage1_hc : m_pImpl->m_aImage2_hc;
592 
593         default:
594             DBG_ERROR( "SvLBoxContextBmp::implGetImageStore: unexpected mode!");
595     }
596 
597     // OJ: #i27071# wrong mode so we just return the normal images
598     return _bFirst ? m_pImpl->m_aImage1 : m_pImpl->m_aImage2;
599 }
600 
InitViewData(SvLBox * pView,SvLBoxEntry * pEntry,SvViewDataItem * pViewData)601 void SvLBoxContextBmp::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
602     SvViewDataItem* pViewData)
603 {
604     DBG_CHKTHIS(SvLBoxContextBmp,0);
605     if( !pViewData )
606         pViewData = pView->GetViewDataItem( pEntry, this );
607     pViewData->aSize = m_pImpl->m_aImage1.GetSizePixel();
608 }
609 
Paint(const Point & _rPos,SvLBox & _rDev,sal_uInt16 _nViewDataEntryFlags,SvLBoxEntry * _pEntry)610 void SvLBoxContextBmp::Paint( const Point& _rPos, SvLBox& _rDev,
611     sal_uInt16 _nViewDataEntryFlags, SvLBoxEntry* _pEntry )
612 {
613     DBG_CHKTHIS(SvLBoxContextBmp,0);
614 
615     // determine the image set
616     BmpColorMode eMode( BMP_COLOR_NORMAL );
617     if ( !!m_pImpl->m_aImage1_hc )
618     {   // we really have HC images
619         if ( _rDev.GetSettings().GetStyleSettings().GetHighContrastMode() )
620             eMode = BMP_COLOR_HIGHCONTRAST;
621     }
622 
623     // get the image
624     const Image& rImage = implGetImageStore( 0 == ( _nViewDataEntryFlags & m_pImpl->m_nB2IndicatorFlags ), eMode );
625 
626     sal_Bool _bSemiTransparent = _pEntry && ( 0 != ( SV_ENTRYFLAG_SEMITRANSPARENT  & _pEntry->GetFlags( ) ) );
627     // draw
628     sal_uInt16 nStyle = _rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE;
629     if ( _bSemiTransparent )
630         nStyle |= IMAGE_DRAW_SEMITRANSPARENT;
631     _rDev.DrawImage( _rPos, rImage, nStyle);
632 }
633 
Create() const634 SvLBoxItem* SvLBoxContextBmp::Create() const
635 {
636     DBG_CHKTHIS(SvLBoxContextBmp,0);
637     return new SvLBoxContextBmp;
638 }
639 
Clone(SvLBoxItem * pSource)640 void SvLBoxContextBmp::Clone( SvLBoxItem* pSource )
641 {
642     DBG_CHKTHIS(SvLBoxContextBmp,0);
643     m_pImpl->m_aImage1 = static_cast< SvLBoxContextBmp* >( pSource )->m_pImpl->m_aImage1;
644     m_pImpl->m_aImage2 = static_cast< SvLBoxContextBmp* >( pSource )->m_pImpl->m_aImage2;
645     m_pImpl->m_nB2IndicatorFlags = static_cast< SvLBoxContextBmp* >( pSource )->m_pImpl->m_nB2IndicatorFlags;
646 }
647 
648