office-gobmx/svtools/source/contnr/svlbitm.cxx
Mathieu Vonlanthen 0bdf6fc7c7 Bug 48549 - System::Beep() removal
Change-Id: I011048912af051a762a78af8646513a1fc624073
2012-07-30 05:20:02 +02:00

569 lines
17 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#include <svtools/svlbox.hxx>
#include <svtools/svlbitm.hxx>
#include <vcl/svapp.hxx>
#include <vcl/button.hxx>
#include <vcl/decoview.hxx>
#include <vcl/salnativewidgets.hxx>
struct SvLBoxButtonData_Impl
{
SvLBoxEntry* pEntry;
sal_Bool bDefaultImages;
sal_Bool bShowRadioButton;
SvLBoxButtonData_Impl() : pEntry( NULL ), bDefaultImages( sal_False ), bShowRadioButton( sal_False ) {}
};
DBG_NAME(SvLBoxButtonData)
void SvLBoxButtonData::InitData( sal_Bool bImagesFromDefault, bool _bRadioBtn, const Control* pCtrl )
{
pImpl = new SvLBoxButtonData_Impl;
bDataOk = sal_False;
eState = SV_BUTTON_UNCHECKED;
pImpl->bDefaultImages = bImagesFromDefault;
pImpl->bShowRadioButton = ( _bRadioBtn != false );
if ( bImagesFromDefault )
SetDefaultImages( pCtrl );
}
SvLBoxButtonData::SvLBoxButtonData( const Control* pControlForSettings )
{
DBG_CTOR(SvLBoxButtonData,0);
InitData( sal_True, false, pControlForSettings );
}
SvLBoxButtonData::SvLBoxButtonData( const Control* pControlForSettings, bool _bRadioBtn )
{
DBG_CTOR(SvLBoxButtonData,0);
InitData( sal_True, _bRadioBtn, pControlForSettings );
}
SvLBoxButtonData::~SvLBoxButtonData()
{
DBG_DTOR(SvLBoxButtonData,0);
delete pImpl;
#ifdef DBG_UTIL
pImpl = NULL;
#endif
}
void SvLBoxButtonData::CallLink()
{
DBG_CHKTHIS(SvLBoxButtonData,0);
aLink.Call( this );
}
sal_uInt16 SvLBoxButtonData::GetIndex( sal_uInt16 nItemState )
{
DBG_CHKTHIS(SvLBoxButtonData,0);
nItemState &= 0x000F;
sal_uInt16 nIdx;
switch( nItemState )
{
case SV_ITEMSTATE_UNCHECKED:
nIdx = SV_BMP_UNCHECKED; break;
case SV_ITEMSTATE_CHECKED:
nIdx = SV_BMP_CHECKED; break;
case SV_ITEMSTATE_TRISTATE:
nIdx = SV_BMP_TRISTATE; break;
case SV_ITEMSTATE_UNCHECKED | SV_ITEMSTATE_HILIGHTED:
nIdx = SV_BMP_HIUNCHECKED; break;
case SV_ITEMSTATE_CHECKED | SV_ITEMSTATE_HILIGHTED:
nIdx = SV_BMP_HICHECKED; break;
case SV_ITEMSTATE_TRISTATE | SV_ITEMSTATE_HILIGHTED:
nIdx = SV_BMP_HITRISTATE; break;
default:
nIdx = SV_BMP_UNCHECKED;
}
return nIdx;
}
void SvLBoxButtonData::SetWidthAndHeight()
{
DBG_CHKTHIS(SvLBoxButtonData,0);
Size aSize = aBmps[0].GetSizePixel();
nWidth = aSize.Width();
nHeight = aSize.Height();
bDataOk = sal_True;
}
void SvLBoxButtonData::StoreButtonState( SvLBoxEntry* pActEntry, sal_uInt16 nItemFlags )
{
DBG_CHKTHIS(SvLBoxButtonData,0);
pImpl->pEntry = pActEntry;
eState = ConvertToButtonState( nItemFlags );
}
SvButtonState SvLBoxButtonData::ConvertToButtonState( sal_uInt16 nItemFlags ) const
{
DBG_CHKTHIS(SvLBoxButtonData,0);
nItemFlags &= (SV_ITEMSTATE_UNCHECKED |
SV_ITEMSTATE_CHECKED |
SV_ITEMSTATE_TRISTATE);
switch( nItemFlags )
{
case SV_ITEMSTATE_UNCHECKED:
return SV_BUTTON_UNCHECKED;
case SV_ITEMSTATE_CHECKED:
return SV_BUTTON_CHECKED;
case SV_ITEMSTATE_TRISTATE:
return SV_BUTTON_TRISTATE;
default:
return SV_BUTTON_UNCHECKED;
}
}
SvLBoxEntry* SvLBoxButtonData::GetActEntry() const
{
DBG_ASSERT( pImpl, "-SvLBoxButtonData::GetActEntry(): don't use me that way!" );
return pImpl->pEntry;
}
void SvLBoxButtonData::SetDefaultImages( const Control* pCtrl )
{
const AllSettings& rSettings = pCtrl? pCtrl->GetSettings() : Application::GetSettings();
if ( pImpl->bShowRadioButton )
{
aBmps[ SV_BMP_UNCHECKED ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DEFAULT );
aBmps[ SV_BMP_CHECKED ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_CHECKED );
aBmps[ SV_BMP_HICHECKED ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_CHECKED | BUTTON_DRAW_PRESSED );
aBmps[ SV_BMP_HIUNCHECKED ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DEFAULT | BUTTON_DRAW_PRESSED );
aBmps[ SV_BMP_TRISTATE ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DONTKNOW );
aBmps[ SV_BMP_HITRISTATE ] = RadioButton::GetRadioImage( rSettings, BUTTON_DRAW_DONTKNOW | BUTTON_DRAW_PRESSED );
}
else
{
aBmps[ SV_BMP_UNCHECKED ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DEFAULT );
aBmps[ SV_BMP_CHECKED ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_CHECKED );
aBmps[ SV_BMP_HICHECKED ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_CHECKED | BUTTON_DRAW_PRESSED );
aBmps[ SV_BMP_HIUNCHECKED ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DEFAULT | BUTTON_DRAW_PRESSED );
aBmps[ SV_BMP_TRISTATE ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DONTKNOW );
aBmps[ SV_BMP_HITRISTATE ] = CheckBox::GetCheckImage( rSettings, BUTTON_DRAW_DONTKNOW | BUTTON_DRAW_PRESSED );
}
}
sal_Bool SvLBoxButtonData::HasDefaultImages( void ) const
{
return pImpl->bDefaultImages;
}
sal_Bool SvLBoxButtonData::IsRadio() {
return pImpl->bShowRadioButton;
}
// ***************************************************************
// class SvLBoxString
// ***************************************************************
DBG_NAME(SvLBoxString);
SvLBoxString::SvLBoxString(SvLBoxEntry* pEntry, sal_uInt16 nFlags, const rtl::OUString& rStr)
: SvLBoxItem(pEntry, nFlags)
{
DBG_CTOR(SvLBoxString,0);
SetText(rStr);
}
SvLBoxString::SvLBoxString() : SvLBoxItem()
{
DBG_CTOR(SvLBoxString,0);
}
SvLBoxString::~SvLBoxString()
{
DBG_DTOR(SvLBoxString,0);
}
sal_uInt16 SvLBoxString::IsA()
{
DBG_CHKTHIS(SvLBoxString,0);
return SV_ITEM_ID_LBOXSTRING;
}
void SvLBoxString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */,
SvLBoxEntry* _pEntry)
{
DBG_CHKTHIS(SvLBoxString,0);
if ( _pEntry )
{
sal_uInt16 nStyle = rDev.IsEnabled() ? 0 : TEXT_DRAW_DISABLE;
if ( rDev.IsEntryMnemonicsEnabled() )
nStyle |= TEXT_DRAW_MNEMONIC;
rDev.DrawText(Rectangle(rPos, GetSize(&rDev,_pEntry)), maText, nStyle);
}
else
rDev.DrawText(rPos, maText);
}
SvLBoxItem* SvLBoxString::Create() const
{
DBG_CHKTHIS(SvLBoxString,0);
return new SvLBoxString;
}
void SvLBoxString::Clone( SvLBoxItem* pSource )
{
DBG_CHKTHIS(SvLBoxString,0);
maText = ((SvLBoxString*)pSource)->maText;
}
void SvLBoxString::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
SvViewDataItem* pViewData)
{
DBG_CHKTHIS(SvLBoxString,0);
if( !pViewData )
pViewData = pView->GetViewDataItem( pEntry, this );
pViewData->aSize = Size(pView->GetTextWidth(maText), pView->GetTextHeight());
}
// ***************************************************************
// class SvLBoxBmp
// ***************************************************************
DBG_NAME(SvLBoxBmp);
SvLBoxBmp::SvLBoxBmp() : SvLBoxItem()
{
DBG_CTOR(SvLBoxBmp,0);
}
SvLBoxBmp::~SvLBoxBmp()
{
DBG_DTOR(SvLBoxBmp,0);
}
sal_uInt16 SvLBoxBmp::IsA()
{
DBG_CHKTHIS(SvLBoxBmp,0);
return SV_ITEM_ID_LBOXBMP;
}
void SvLBoxBmp::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
SvViewDataItem* pViewData)
{
DBG_CHKTHIS(SvLBoxBmp,0);
if( !pViewData )
pViewData = pView->GetViewDataItem( pEntry, this );
pViewData->aSize = aBmp.GetSizePixel();
}
void SvLBoxBmp::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */,
SvLBoxEntry* )
{
DBG_CHKTHIS(SvLBoxBmp,0);
sal_uInt16 nStyle = rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE;
rDev.DrawImage( rPos, aBmp ,nStyle);
}
SvLBoxItem* SvLBoxBmp::Create() const
{
DBG_CHKTHIS(SvLBoxBmp,0);
return new SvLBoxBmp;
}
void SvLBoxBmp::Clone( SvLBoxItem* pSource )
{
DBG_CHKTHIS(SvLBoxBmp,0);
aBmp = ((SvLBoxBmp*)pSource)->aBmp;
}
// ***************************************************************
// class SvLBoxButton
// ***************************************************************
DBG_NAME(SvLBoxButton);
SvLBoxButton::SvLBoxButton( SvLBoxEntry* pEntry, SvLBoxButtonKind eTheKind,
sal_uInt16 nFlags, SvLBoxButtonData* pBData )
: SvLBoxItem( pEntry, nFlags )
{
DBG_CTOR(SvLBoxButton,0);
eKind = eTheKind;
nBaseOffs = 0;
nItemFlags = 0;
SetStateUnchecked();
pData = pBData;
}
SvLBoxButton::SvLBoxButton() : SvLBoxItem()
{
DBG_CTOR(SvLBoxButton,0);
eKind = SvLBoxButtonKind_enabledCheckbox;
nItemFlags = 0;
SetStateUnchecked();
}
SvLBoxButton::~SvLBoxButton()
{
DBG_DTOR(SvLBoxButton,0);
}
sal_uInt16 SvLBoxButton::IsA()
{
DBG_CHKTHIS(SvLBoxButton,0);
return SV_ITEM_ID_LBOXBUTTON;
}
sal_Bool SvLBoxButton::ClickHdl( SvLBox*, SvLBoxEntry* pEntry )
{
DBG_CHKTHIS(SvLBoxButton,0);
if ( CheckModification() )
{
if ( IsStateChecked() )
SetStateUnchecked();
else
SetStateChecked();
pData->StoreButtonState( pEntry, nItemFlags );
pData->CallLink();
}
return sal_False;
}
void SvLBoxButton::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /* nFlags */,
SvLBoxEntry* /*pEntry*/ )
{
DBG_CHKTHIS(SvLBoxButton,0);
sal_uInt16 nIndex = eKind == SvLBoxButtonKind_staticImage
? SV_BMP_STATICIMAGE : pData->GetIndex( nItemFlags );
sal_uInt16 nStyle = eKind != SvLBoxButtonKind_disabledCheckbox &&
rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE;
///
//Native drawing
///
sal_Bool bNativeOK = sal_False;
ControlType eCtrlType = (pData->IsRadio())? CTRL_RADIOBUTTON : CTRL_CHECKBOX;
if ( nIndex != SV_BMP_STATICIMAGE && rDev.IsNativeControlSupported( eCtrlType, PART_ENTIRE_CONTROL) )
{
Size aSize(pData->Width(), pData->Height());
ImplAdjustBoxSize( aSize, eCtrlType, &rDev );
ImplControlValue aControlValue;
Rectangle aCtrlRegion( rPos, aSize );
ControlState nState = 0;
//states CTRL_STATE_DEFAULT, CTRL_STATE_PRESSED and CTRL_STATE_ROLLOVER are not implemented
if ( IsStateHilighted() ) nState |= CTRL_STATE_FOCUSED;
if ( nStyle != IMAGE_DRAW_DISABLE ) nState |= CTRL_STATE_ENABLED;
if ( IsStateChecked() )
aControlValue.setTristateVal( BUTTONVALUE_ON );
else if ( IsStateUnchecked() )
aControlValue.setTristateVal( BUTTONVALUE_OFF );
else if ( IsStateTristate() )
aControlValue.setTristateVal( BUTTONVALUE_MIXED );
bNativeOK = rDev.DrawNativeControl( eCtrlType, PART_ENTIRE_CONTROL,
aCtrlRegion, nState, aControlValue, rtl::OUString() );
}
if( !bNativeOK)
rDev.DrawImage( rPos, pData->aBmps[nIndex + nBaseOffs] ,nStyle);
}
SvLBoxItem* SvLBoxButton::Create() const
{
DBG_CHKTHIS(SvLBoxButton,0);
return new SvLBoxButton;
}
void SvLBoxButton::Clone( SvLBoxItem* pSource )
{
DBG_CHKTHIS(SvLBoxButton,0);
pData = ((SvLBoxButton*)pSource)->pData;
}
void SvLBoxButton::ImplAdjustBoxSize( Size& io_rSize, ControlType i_eType, Window* i_pParent )
{
if ( i_pParent->IsNativeControlSupported( i_eType, PART_ENTIRE_CONTROL) )
{
ImplControlValue aControlValue;
Rectangle aCtrlRegion( Point( 0, 0 ), io_rSize );
ControlState nState = CTRL_STATE_ENABLED;
aControlValue.setTristateVal( BUTTONVALUE_ON );
Rectangle aNativeBounds, aNativeContent;
bool bNativeOK = i_pParent->GetNativeControlRegion( i_eType,
PART_ENTIRE_CONTROL,
aCtrlRegion,
nState,
aControlValue,
rtl::OUString(),
aNativeBounds,
aNativeContent );
if( bNativeOK )
{
Size aContentSize( aNativeContent.GetSize() );
// leave a little space around the box image (looks better)
if( aContentSize.Height() + 2 > io_rSize.Height() )
io_rSize.Height() = aContentSize.Height() + 2;
if( aContentSize.Width() + 2 > io_rSize.Width() )
io_rSize.Width() = aContentSize.Width() + 2;
}
}
}
void SvLBoxButton::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
SvViewDataItem* pViewData )
{
DBG_CHKTHIS(SvLBoxButton,0);
if( !pViewData )
pViewData = pView->GetViewDataItem( pEntry, this );
Size aSize( pData->Width(), pData->Height() );
ControlType eCtrlType = (pData->IsRadio())? CTRL_RADIOBUTTON : CTRL_CHECKBOX;
if ( eKind != SvLBoxButtonKind_staticImage && pView )
ImplAdjustBoxSize( aSize, eCtrlType, pView );
pViewData->aSize = aSize;
}
bool SvLBoxButton::CheckModification() const
{
return eKind == SvLBoxButtonKind_enabledCheckbox;
}
// ***************************************************************
// class SvLBoxContextBmp
// ***************************************************************
struct SvLBoxContextBmp_Impl
{
Image m_aImage1;
Image m_aImage2;
sal_uInt16 m_nB2IndicatorFlags;
};
// ***************************************************************
DBG_NAME(SvLBoxContextBmp)
SvLBoxContextBmp::SvLBoxContextBmp( SvLBoxEntry* pEntry, sal_uInt16 nItemFlags,
Image aBmp1, Image aBmp2, sal_uInt16 nEntryFlags )
:SvLBoxItem( pEntry, nItemFlags )
,m_pImpl( new SvLBoxContextBmp_Impl )
{
DBG_CTOR(SvLBoxContextBmp,0);
m_pImpl->m_nB2IndicatorFlags = nEntryFlags;
SetModeImages( aBmp1, aBmp2 );
}
SvLBoxContextBmp::SvLBoxContextBmp()
:SvLBoxItem( )
,m_pImpl( new SvLBoxContextBmp_Impl )
{
m_pImpl->m_nB2IndicatorFlags = 0;
DBG_CTOR(SvLBoxContextBmp,0);
}
SvLBoxContextBmp::~SvLBoxContextBmp()
{
delete m_pImpl;
DBG_DTOR(SvLBoxContextBmp,0);
}
sal_uInt16 SvLBoxContextBmp::IsA()
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
return SV_ITEM_ID_LBOXCONTEXTBMP;
}
sal_Bool SvLBoxContextBmp::SetModeImages( const Image& _rBitmap1, const Image& _rBitmap2 )
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
sal_Bool bSuccess = sal_True;
m_pImpl->m_aImage1 = _rBitmap1;
m_pImpl->m_aImage2 = _rBitmap2;
return bSuccess;
}
Image& SvLBoxContextBmp::implGetImageStore( sal_Bool _bFirst )
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
// OJ: #i27071# wrong mode so we just return the normal images
return _bFirst ? m_pImpl->m_aImage1 : m_pImpl->m_aImage2;
}
void SvLBoxContextBmp::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry,
SvViewDataItem* pViewData)
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
if( !pViewData )
pViewData = pView->GetViewDataItem( pEntry, this );
pViewData->aSize = m_pImpl->m_aImage1.GetSizePixel();
}
void SvLBoxContextBmp::Paint( const Point& _rPos, SvLBox& _rDev,
sal_uInt16 _nViewDataEntryFlags, SvLBoxEntry* _pEntry )
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
// get the image
const Image& rImage = implGetImageStore( 0 == ( _nViewDataEntryFlags & m_pImpl->m_nB2IndicatorFlags ) );
sal_Bool _bSemiTransparent = _pEntry && ( 0 != ( SV_ENTRYFLAG_SEMITRANSPARENT & _pEntry->GetFlags( ) ) );
// draw
sal_uInt16 nStyle = _rDev.IsEnabled() ? 0 : IMAGE_DRAW_DISABLE;
if ( _bSemiTransparent )
nStyle |= IMAGE_DRAW_SEMITRANSPARENT;
_rDev.DrawImage( _rPos, rImage, nStyle);
}
SvLBoxItem* SvLBoxContextBmp::Create() const
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
return new SvLBoxContextBmp;
}
void SvLBoxContextBmp::Clone( SvLBoxItem* pSource )
{
DBG_CHKTHIS(SvLBoxContextBmp,0);
m_pImpl->m_aImage1 = static_cast< SvLBoxContextBmp* >( pSource )->m_pImpl->m_aImage1;
m_pImpl->m_aImage2 = static_cast< SvLBoxContextBmp* >( pSource )->m_pImpl->m_aImage2;
m_pImpl->m_nB2IndicatorFlags = static_cast< SvLBoxContextBmp* >( pSource )->m_pImpl->m_nB2IndicatorFlags;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */