xref: /trunk/main/svtools/source/contnr/svlbitm.cxx (revision 5900e8ec)
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