blob: 38861e360a668c510d077e8599c73bd3612fb500 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_vcl.hxx"
#include <vcl/event.hxx>
#include <vcl/imgctrl.hxx>
#include <tools/rcid.h>
#include <com/sun/star/awt/ImageScaleMode.hdl>
namespace ImageScaleMode = ::com::sun::star::awt::ImageScaleMode;
// -----------------------------------------------------------------------
ImageControl::ImageControl( Window* pParent, WinBits nStyle )
:FixedImage( pParent, nStyle )
,mnScaleMode( ImageScaleMode::ANISOTROPIC )
{
}
// -----------------------------------------------------------------------
ImageControl::ImageControl( Window* pParent, const ResId& rResId )
:FixedImage( pParent, rResId )
,mnScaleMode( ImageScaleMode::ANISOTROPIC )
{
}
// -----------------------------------------------------------------------
void ImageControl::SetScaleMode( const ::sal_Int16 _nMode )
{
if ( _nMode != mnScaleMode )
{
mnScaleMode = _nMode;
Invalidate();
}
}
// -----------------------------------------------------------------------
void ImageControl::Resize()
{
Invalidate();
}
// -----------------------------------------------------------------------
namespace
{
static Size lcl_calcPaintSize( const Rectangle& _rPaintRect, const Size& _rBitmapSize )
{
const Size aPaintSize = _rPaintRect.GetSize();
const double nRatioX = 1.0 * aPaintSize.Width() / _rBitmapSize.Width();
const double nRatioY = 1.0 * aPaintSize.Height() / _rBitmapSize.Height();
const double nRatioMin = ::std::min( nRatioX, nRatioY );
return Size( long( _rBitmapSize.Width() * nRatioMin ), long( _rBitmapSize.Height() * nRatioMin ) );
}
static Point lcl_centerWithin( const Rectangle& _rArea, const Size& _rObjectSize )
{
Point aPos( _rArea.TopLeft() );
aPos.X() += ( _rArea.GetWidth() - _rObjectSize.Width() ) / 2;
aPos.Y() += ( _rArea.GetHeight() - _rObjectSize.Height() ) / 2;
return aPos;
}
}
// -----------------------------------------------------------------------
void ImageControl::ImplDraw( OutputDevice& rDev, sal_uLong nDrawFlags, const Point& rPos, const Size& rSize ) const
{
sal_uInt16 nStyle = 0;
if ( !(nDrawFlags & WINDOW_DRAW_NODISABLE) )
{
if ( !IsEnabled() )
nStyle |= IMAGE_DRAW_DISABLE;
}
const Image& rImage( GetModeImage( BMP_COLOR_NORMAL ) );
const Image& rImageHC( GetModeImage( BMP_COLOR_HIGHCONTRAST ) );
const Image* pImage = &rImage;
if ( !!rImageHC && GetSettings().GetStyleSettings().GetHighContrastMode() )
pImage = &rImageHC;
const Rectangle aDrawRect( rPos, rSize );
if ( !*pImage )
{
String sText( GetText() );
if ( !sText.Len() )
return;
WinBits nWinStyle = GetStyle();
sal_uInt16 nTextStyle = FixedText::ImplGetTextStyle( nWinStyle );
if ( !(nDrawFlags & WINDOW_DRAW_NODISABLE) )
if ( !IsEnabled() )
nTextStyle |= TEXT_DRAW_DISABLE;
rDev.DrawText( aDrawRect, sText, nTextStyle );
return;
}
const Size& rBitmapSize = pImage->GetSizePixel();
switch ( mnScaleMode )
{
case ImageScaleMode::NONE:
{
rDev.DrawImage( lcl_centerWithin( aDrawRect, rBitmapSize ), *pImage, nStyle );
}
break;
case ImageScaleMode::ISOTROPIC:
{
const Size aPaintSize = lcl_calcPaintSize( aDrawRect, rBitmapSize );
rDev.DrawImage(
lcl_centerWithin( aDrawRect, aPaintSize ),
aPaintSize,
*pImage, nStyle );
}
break;
case ImageScaleMode::ANISOTROPIC:
{
rDev.DrawImage(
aDrawRect.TopLeft(),
aDrawRect.GetSize(),
*pImage, nStyle );
}
break;
default:
OSL_ENSURE( false, "ImageControl::ImplDraw: unhandled scale mode!" );
break;
} // switch ( mnScaleMode )
}
// -----------------------------------------------------------------------
void ImageControl::Paint( const Rectangle& /*rRect*/ )
{
ImplDraw( *this, 0, Point(), GetOutputSizePixel() );
if( HasFocus() )
{
Window *pWin = GetWindow( WINDOW_BORDER );
sal_Bool bFlat = (GetBorderStyle() == 2);
Rectangle aRect( Point(0,0), pWin->GetOutputSizePixel() );
Color oldLineCol = pWin->GetLineColor();
Color oldFillCol = pWin->GetFillColor();
pWin->SetFillColor();
pWin->SetLineColor( bFlat ? COL_WHITE : COL_BLACK );
pWin->DrawRect( aRect );
aRect.nLeft++;
aRect.nRight--;
aRect.nTop++;
aRect.nBottom--;
pWin->SetLineColor( bFlat ? COL_BLACK : COL_WHITE );
pWin->DrawRect( aRect );
pWin->SetLineColor( oldLineCol );
pWin->SetFillColor( oldFillCol );
}
}
// -----------------------------------------------------------------------
void ImageControl::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
{
const Point aPos = pDev->LogicToPixel( rPos );
const Size aSize = pDev->LogicToPixel( rSize );
Rectangle aRect( aPos, aSize );
pDev->Push();
pDev->SetMapMode();
// Border
if ( !(nFlags & WINDOW_DRAW_NOBORDER) && (GetStyle() & WB_BORDER) )
{
ImplDrawFrame( pDev, aRect );
}
pDev->IntersectClipRegion( aRect );
ImplDraw( *pDev, nFlags, aRect.TopLeft(), aRect.GetSize() );
pDev->Pop();
}
// -----------------------------------------------------------------------
void ImageControl::GetFocus()
{
FixedImage::GetFocus();
GetWindow( WINDOW_BORDER )->Invalidate();
}
// -----------------------------------------------------------------------
void ImageControl::LoseFocus()
{
FixedImage::GetFocus();
GetWindow( WINDOW_BORDER )->Invalidate();
}