diff options
Diffstat (limited to 'vcl/source/control/imgctrl.cxx')
-rw-r--r-- | vcl/source/control/imgctrl.cxx | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/vcl/source/control/imgctrl.cxx b/vcl/source/control/imgctrl.cxx new file mode 100644 index 000000000000..075a8b1b95e2 --- /dev/null +++ b/vcl/source/control/imgctrl.cxx @@ -0,0 +1,269 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include <vcl/event.hxx> +#include <vcl/imgctrl.hxx> + +#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; +} + +// ----------------------------------------------------------------------- + +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::UserDraw( const UserDrawEvent& rUDEvt ) +{ + USHORT nStyle = 0; + BitmapEx* pBitmap = &maBmp; + if( !!maBmpHC ) + { + if( GetSettings().GetStyleSettings().GetHighContrastMode() ) + pBitmap = &maBmpHC; + } + + if ( !*pBitmap ) + { + String sText( GetText() ); + if ( !sText.Len() ) + return; + + WinBits nWinStyle = GetStyle(); + USHORT nTextStyle = FixedText::ImplGetTextStyle( nWinStyle ); + if ( !IsEnabled() ) + nTextStyle |= TEXT_DRAW_DISABLE; + + DrawText( rUDEvt.GetRect(), sText, nTextStyle ); + return; + } + + const Rectangle& rPaintRect = rUDEvt.GetRect(); + const Size& rBitmapSize = maBmp.GetSizePixel(); + + if( nStyle & IMAGE_DRAW_COLORTRANSFORM ) + { + // only images support IMAGE_DRAW_COLORTRANSFORM + Image aImage( *pBitmap ); + if ( !!aImage ) + { + switch ( mnScaleMode ) + { + case ImageScaleMode::None: + { + rUDEvt.GetDevice()->DrawImage( + lcl_centerWithin( rPaintRect, rBitmapSize ), aImage, nStyle ); + } + break; + + case ImageScaleMode::Isotropic: + { + const Size aPaintSize = lcl_calcPaintSize( rPaintRect, rBitmapSize ); + rUDEvt.GetDevice()->DrawImage( + lcl_centerWithin( rPaintRect, aPaintSize ), + aPaintSize, + aImage, nStyle ); + } + break; + + case ImageScaleMode::Anisotropic: + { + rUDEvt.GetDevice()->DrawImage( + rPaintRect.TopLeft(), + rPaintRect.GetSize(), + aImage, nStyle ); + } + break; + + default: + OSL_ENSURE( false, "ImageControl::UserDraw: unhandled scale mode!" ); + break; + + } // switch ( mnScaleMode ) + } + } + else + { + switch ( mnScaleMode ) + { + case ImageScaleMode::None: + { + pBitmap->Draw( rUDEvt.GetDevice(), lcl_centerWithin( rPaintRect, rBitmapSize ) ); + } + break; + + case ImageScaleMode::Isotropic: + { + const Size aPaintSize = lcl_calcPaintSize( rPaintRect, rBitmapSize ); + pBitmap->Draw( rUDEvt.GetDevice(), + lcl_centerWithin( rPaintRect, aPaintSize ), + aPaintSize ); + } + break; + + case ImageScaleMode::Anisotropic: + { + pBitmap->Draw( rUDEvt.GetDevice(), + rPaintRect.TopLeft(), + rPaintRect.GetSize() ); + } + break; + + default: + OSL_ENSURE( false, "ImageControl::UserDraw: unhandled scale mode!" ); + break; + + } // switch ( mnScaleMode ) + } +} + +// ----------------------------------------------------------------------- + +void ImageControl::SetBitmap( const BitmapEx& rBmp ) +{ + maBmp = rBmp; + StateChanged( STATE_CHANGE_DATA ); +} + +// ----------------------------------------------------------------------- + +BOOL ImageControl::SetModeBitmap( const BitmapEx& rBitmap, BmpColorMode eMode ) +{ + if( eMode == BMP_COLOR_NORMAL ) + SetBitmap( rBitmap ); + else if( eMode == BMP_COLOR_HIGHCONTRAST ) + { + maBmpHC = rBitmap; + StateChanged( STATE_CHANGE_DATA ); + } + else + return FALSE; + return TRUE; +} + +// ----------------------------------------------------------------------- + +const BitmapEx& ImageControl::GetModeBitmap( BmpColorMode eMode ) const +{ + if( eMode == BMP_COLOR_HIGHCONTRAST ) + return maBmpHC; + else + return maBmp; +} + +// ----------------------------------------------------------------------- + +void ImageControl::Paint( const Rectangle& rRect ) +{ + FixedImage::Paint( rRect ); + if( HasFocus() ) + { + Window *pWin = GetWindow( WINDOW_BORDER ); + + 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::GetFocus() +{ + FixedImage::GetFocus(); + GetWindow( WINDOW_BORDER )->Invalidate(); +} + +// ----------------------------------------------------------------------- + +void ImageControl::LoseFocus() +{ + FixedImage::GetFocus(); + GetWindow( WINDOW_BORDER )->Invalidate(); +} + |