X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e08b761b0c5ecb6df295785b78f1f3637331887..9085d634d9e29a877761ef51a01c740749648e33:/contrib/src/fl/newbmpbtn.cpp diff --git a/contrib/src/fl/newbmpbtn.cpp b/contrib/src/fl/newbmpbtn.cpp index be095bd915..138e9cf1c6 100644 --- a/contrib/src/fl/newbmpbtn.cpp +++ b/contrib/src/fl/newbmpbtn.cpp @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: No names yet. -// Purpose: Contrib. demo +// Name: newbmpbtn.cpp +// Purpose: wxNewBitmapButton enhanced bitmap button class. // Author: Aleksandras Gluchovas // Modified by: // Created: ??/09/98 // RCS-ID: $Id$ // Copyright: (c) Aleksandras Gluchovas -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -27,16 +27,22 @@ #include "wx/fl/newbmpbtn.h" #include "wx/utils.h" // import wxMin,wxMax macros +#ifdef __WXMSW__ +#include "wx/msw/private.h" +#endif + ///////////// button-label rendering helpers ////////////////// static int* create_array( int width, int height, int fill = 0 ) { - int* array = new int[width*height]; + int* array = new int[width*height]; - int len = width*height; - for( int i = 0; i != len; ++i ) array[i] = fill; + int len = width*height; + int i; + for ( i = 0; i != len; ++i ) + array[i] = fill; - return array; + return array; } #define GET_ELEM(array,x,y) (array[width*(y)+(x)]) @@ -46,20 +52,20 @@ static int* create_array( int width, int height, int fill = 0 ) #define IS_IN_ARRAY(x,y) ( (x) < width && (y) < height && (x) >= 0 && (y) >= 0 ) #define GET_RED(col) col & 0xFF -#define GET_GREEN(col) (col >> 8) & 0xFF +#define GET_GREEN(col) (col >> 8) & 0xFF #define GET_BLUE(col) (col >> 16) & 0xFF #define MAKE_INT_COLOR(red,green,blue) ( (red) | \ ( ( (green) << 8 ) & 0xFF00 ) | \ - ( ( (blue) << 16) & 0xFF0000) \ + ( ( (blue) << 16) & 0xFF0000) \ ) #define IS_GREATER(col1,col2) ( ( (GET_RED(col1) ) > (GET_RED(col2) ) + MIN_COLOR_DIFF ) && \ ( (GET_GREEN(col1)) > (GET_GREEN(col2)) + MIN_COLOR_DIFF ) && \ - ( (GET_BLUE(col1) ) > (GET_BLUE(col2) ) + MIN_COLOR_DIFF ) \ - ) + ( (GET_BLUE(col1) ) > (GET_BLUE(col2) ) + MIN_COLOR_DIFF ) \ + ) -#define MASK_BG 0 +#define MASK_BG 0 #define MASK_DARK 1 #define MASK_LIGHT 2 @@ -67,766 +73,789 @@ static int* create_array( int width, int height, int fill = 0 ) static void gray_out_pixmap( int* src, int* dest, int width, int height ) { - // assuming the pixels along the edges are of the background color - - int x = 0; - int y = 1; - - do - { - int cur = GET_ELEM(src,x,y); - - - if ( IS_IN_ARRAY(x-1,y-1) ) - { - int upperElem = GET_ELEM(src,x-1,y-1); - - // if the upper element is lighter than current - if ( IS_GREATER(upperElem,cur) ) - { - GET_ELEM(dest,x,y) = MASK_DARK; - } - else - // if the current element is ligher than the upper - if ( IS_GREATER(cur,upperElem) ) - { - GET_ELEM(dest,x,y) = MASK_LIGHT; - } - else - { - if ( GET_ELEM(dest,x-1,y-1) == MASK_LIGHT ) - - GET_ELEM(dest,x,y) = MASK_BG; - - if ( GET_ELEM(dest,x-1,y-1 ) == MASK_DARK ) - - GET_ELEM(dest,x,y) = MASK_DARK; - else - GET_ELEM(dest,x,y) = MASK_BG; - } - } - - // go zig-zag - - if ( IS_IN_ARRAY(x+1,y-1) ) - { - ++x;--y; - } - else - { - while( IS_IN_ARRAY(x-1,y+1) ) - { - --x;++y; - } - - if ( IS_IN_ARRAY(x,y+1) ) - { - ++y; continue; - } - else - { - if ( IS_IN_ARRAY(x+1,y) ) - { - ++x; continue; - } - else break; - } - } - - } while(1); + // assuming the pixels along the edges are of the background color + + int x = 0; + int y = 1; + + do + { + int cur = GET_ELEM(src,x,y); + + + if ( IS_IN_ARRAY(x-1,y-1) ) + { + int upperElem = GET_ELEM(src,x-1,y-1); + + // if the upper element is lighter than current + if ( IS_GREATER(upperElem,cur) ) + { + GET_ELEM(dest,x,y) = MASK_DARK; + } + else + // if the current element is ligher than the upper + if ( IS_GREATER(cur,upperElem) ) + { + GET_ELEM(dest,x,y) = MASK_LIGHT; + } + else + { + if ( GET_ELEM(dest,x-1,y-1) == MASK_LIGHT ) + + GET_ELEM(dest,x,y) = MASK_BG; + + if ( GET_ELEM(dest,x-1,y-1 ) == MASK_DARK ) + + GET_ELEM(dest,x,y) = MASK_DARK; + else + GET_ELEM(dest,x,y) = MASK_BG; + } + } + + // go zig-zag + + if ( IS_IN_ARRAY(x+1,y-1) ) + { + ++x; + --y; + } + else + { + while ( IS_IN_ARRAY(x-1,y+1) ) + { + --x; + ++y; + } + + if ( IS_IN_ARRAY(x,y+1) ) + { + ++y; + continue; + } + else + { + if ( IS_IN_ARRAY(x+1,y) ) + { + ++x; + continue; + } + else break; + } + } + + } while (1); } -// alg. for making the image look "grayed" (e.g. disabled button) +// algorithm for making the image look "grayed" (e.g. disabled button) // NOTE:: used GetPixel(), which is Windows-Only! void gray_out_image_on_dc( wxDC& dc, int width, int height ) { - // assuming the pixels along the edges are of the background color - wxColour bgCol; - dc.GetPixel( 0, 0, &bgCol ); - - wxPen darkPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW),1, wxSOLID ); - wxPen lightPen( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT),1, wxSOLID ); - wxPen bgPen ( bgCol, 1, wxSOLID ); - - int* src = create_array( width, height, MASK_BG ); - int* dest = create_array( width, height, MASK_BG ); - - int y = 0; - for( y = 0; y != height; ++y ) - - for( int x = 0; x != width; ++x ) - { - wxColour col; - dc.GetPixel( x,y, &col ); - - - GET_ELEM(src,x,y) = MAKE_INT_COLOR( col.Red(), col.Green(), col.Blue() ); - } - - gray_out_pixmap( src, dest, width, height ); - - for( y = 0; y != height; ++y ) - - for( int x = 0; x != width; ++x ) - { - int mask = GET_ELEM(dest,x,y); - - switch (mask) - { - case MASK_BG : { dc.SetPen( bgPen ); - dc.DrawPoint( x,y ); break; - } - case MASK_DARK : { dc.SetPen( darkPen ); - dc.DrawPoint( x,y ); break; - } - case MASK_LIGHT : { dc.SetPen( lightPen ); - dc.DrawPoint( x,y ); break; - } - default : break; - } - } - - delete [] src; - delete [] dest; + // assuming the pixels along the edges are of the background color + wxColour bgCol; + dc.GetPixel( 0, 0, &bgCol ); + + wxPen darkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW),1, wxSOLID ); + wxPen lightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT),1, wxSOLID ); + wxPen bgPen ( bgCol, 1, wxSOLID ); + + int* src = create_array( width, height, MASK_BG ); + int* dest = create_array( width, height, MASK_BG ); + + int x, y; + for ( y = 0; y != height; ++y ) + { + for ( x = 0; x != width; ++x ) + { + wxColour col; + dc.GetPixel( x,y, &col ); + + GET_ELEM(src,x,y) = MAKE_INT_COLOR( col.Red(), col.Green(), col.Blue() ); + } + } + gray_out_pixmap( src, dest, width, height ); + + for ( y = 0; y != height; ++y ) + { + for ( x = 0; x != width; ++x ) + { + int mask = GET_ELEM(dest,x,y); + + switch (mask) + { + case MASK_BG : { dc.SetPen( bgPen ); + dc.DrawPoint( x,y ); break; + } + case MASK_DARK : { dc.SetPen( darkPen ); + dc.DrawPoint( x,y ); break; + } + case MASK_LIGHT : { dc.SetPen( lightPen ); + dc.DrawPoint( x,y ); break; + } + default : break; + } + } + } + delete [] src; + delete [] dest; } /////////////////////////////// -/***** Impelementation for class wxNewBitmapButton *****/ +/***** Implementation for class wxNewBitmapButton *****/ IMPLEMENT_DYNAMIC_CLASS(wxNewBitmapButton, wxPanel) BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel ) - EVT_LEFT_DOWN( wxNewBitmapButton::OnLButtonDown ) - EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp ) - EVT_MOTION ( wxNewBitmapButton::OnMouseMove ) + EVT_LEFT_DOWN ( wxNewBitmapButton::OnLButtonDown ) + EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp ) + EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick ) + EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter ) + EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave ) - EVT_SIZE ( wxNewBitmapButton::OnSize ) - EVT_PAINT( wxNewBitmapButton::OnPaint ) + EVT_SIZE ( wxNewBitmapButton::OnSize ) + EVT_PAINT( wxNewBitmapButton::OnPaint ) - //EVT_KILL_FOCUS( wxNewBitmapButton::OnKillFocus ) + //EVT_KILL_FOCUS( wxNewBitmapButton::OnKillFocus ) - EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground ) + EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground ) END_EVENT_TABLE() wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap, - const wxString& labelText, - int alignText, - bool isFlat, - int firedEventType, - int marginX, - int marginY, - int textToLabelGap, - bool isSticky) - : mTextToLabelGap ( textToLabelGap ), - mMarginX( marginX ), - mMarginY( marginY ), - mTextAlignment( alignText ), - mIsSticky( isSticky ), - mIsFlat( isFlat ), - mLabelText( labelText ), - mImageFileType( -1 ), - mDepressedBmp( labelBitmap ), - - mpDepressedImg( NULL ), - mpPressedImg ( NULL ), - mpDisabledImg ( NULL ), - mpFocusedImg ( NULL ), - - - mDragStarted ( FALSE ), - mIsPressed ( FALSE ), - mIsInFocus( FALSE ), - mPrevPressedState( FALSE ), - mPrevInFocusState( FALSE ), - mHasFocusedBmp( FALSE ), - mFiredEventType( firedEventType ), - - mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ), - mDarkPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ), - mGrayPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ), - mLightPen( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ), - - mIsCreated( FALSE ), - mSizeIsSet( FALSE ) + const wxString& labelText, + int alignText, + bool isFlat, + int firedEventType, + int marginX, + int marginY, + int textToLabelGap, + bool isSticky) + : mTextToLabelGap ( textToLabelGap ), + mMarginX( marginX ), + mMarginY( marginY ), + mTextAlignment( alignText ), + mIsSticky( isSticky ), + mIsFlat( isFlat ), + mLabelText( labelText ), + mImageFileType( wxBITMAP_TYPE_INVALID ), + mDepressedBmp( labelBitmap ), + + mpDepressedImg( NULL ), + mpPressedImg ( NULL ), + mpDisabledImg ( NULL ), + mpFocusedImg ( NULL ), + + + mDragStarted ( FALSE ), + mIsPressed ( FALSE ), + mIsInFocus( FALSE ), + mHasFocusedBmp( FALSE ), + mFiredEventType( firedEventType ), + + mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ), + mDarkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ), + mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ), + mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ), + + mIsCreated( FALSE ), + mSizeIsSet( FALSE ) { } wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName, - const int bitmapFileType, - const wxString& labelText, - int alignText, - bool isFlat, - int firedEventType, - int marginX, - int marginY, - int textToLabelGap, - bool isSticky) - - : mTextToLabelGap ( 2 ), - mMarginX( 2 ), - mMarginY( 2 ), - mTextAlignment( alignText ), - mIsSticky( FALSE ), - mIsFlat( isFlat ), - mLabelText( labelText ), - mImageFileName( bitmapFileName ), - mImageFileType( bitmapFileType ), - - mpDepressedImg( NULL ), - mpPressedImg ( NULL ), - mpDisabledImg ( NULL ), - mpFocusedImg ( NULL ), - - mDragStarted ( FALSE ), - mIsPressed ( FALSE ), - mIsInFocus ( FALSE ), - mPrevPressedState( FALSE ), - mPrevInFocusState( FALSE ), - mHasFocusedBmp( FALSE ), - mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ), - - mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ), - mDarkPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ), - mGrayPen ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ), - mLightPen( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ), - - mIsCreated( FALSE ), - mSizeIsSet( FALSE ) + const wxBitmapType bitmapFileType, + const wxString& labelText, + int alignText, + bool isFlat, + int firedEventType, + int marginX, + int marginY, + int textToLabelGap, + bool isSticky) + + : mTextToLabelGap ( 2 ), + mMarginX( 2 ), + mMarginY( 2 ), + mTextAlignment( alignText ), + mIsSticky( FALSE ), + mIsFlat( isFlat ), + mLabelText( labelText ), + mImageFileName( bitmapFileName ), + mImageFileType( bitmapFileType ), + + mpDepressedImg( NULL ), + mpPressedImg ( NULL ), + mpDisabledImg ( NULL ), + mpFocusedImg ( NULL ), + + mDragStarted ( FALSE ), + mIsPressed ( FALSE ), + mIsInFocus ( FALSE ), + mHasFocusedBmp( FALSE ), + mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ), + + mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ), + mDarkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ), + mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ), + mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ), + + mIsCreated( FALSE ), + mSizeIsSet( FALSE ) { } wxNewBitmapButton::~wxNewBitmapButton(void) { - DestroyLabels(); + DestroyLabels(); } void wxNewBitmapButton::DrawShade( int outerLevel, - wxDC& dc, - wxPen& upperLeftSidePen, - wxPen& lowerRightSidePen ) + wxDC& dc, + wxPen& upperLeftSidePen, + wxPen& lowerRightSidePen ) { - wxBitmap* pBmp = GetStateLabel(); + wxBitmap* pBmp = GetStateLabel(); - int x = mMarginX - (outerLevel + 1); - int y = mMarginY - (outerLevel + 1); + int x = mMarginX - (outerLevel + 1); + int y = mMarginY - (outerLevel + 1); - int height = pBmp->GetHeight() + (outerLevel + 1)*2 - 1; - int width = pBmp->GetWidth() + (outerLevel + 1)*2 - 1; + int height = pBmp->GetHeight() + (outerLevel + 1)*2 - 1; + int width = pBmp->GetWidth() + (outerLevel + 1)*2 - 1; - dc.SetPen( upperLeftSidePen ); - dc.DrawLine( x,y, x + width, y ); - dc.DrawLine( x,y, x, y + height ); + dc.SetPen( upperLeftSidePen ); + dc.DrawLine( x,y, x + width, y ); + dc.DrawLine( x,y, x, y + height ); - dc.SetPen( lowerRightSidePen ); - dc.DrawLine( x + width, y, x + width, y + height + 1 ); - dc.DrawLine( x, y + height, x + width, y + height ); + dc.SetPen( lowerRightSidePen ); + dc.DrawLine( x + width, y, x + width, y + height + 1 ); + dc.DrawLine( x, y + height, x + width, y + height ); } void wxNewBitmapButton::DestroyLabels() { - if ( mpDepressedImg ) delete mpDepressedImg; - if ( mpPressedImg ) delete mpPressedImg; - if ( mpDisabledImg ) delete mpDisabledImg; - if ( mpFocusedImg ) delete mpFocusedImg; - - mpDepressedImg = NULL; - mpPressedImg = NULL; - mpDisabledImg = NULL; - mpFocusedImg = NULL; + if ( mpDepressedImg ) delete mpDepressedImg; + if ( mpPressedImg ) delete mpPressedImg; + if ( mpDisabledImg ) delete mpDisabledImg; + if ( mpFocusedImg ) delete mpFocusedImg; + + mpDepressedImg = NULL; + mpPressedImg = NULL; + mpDisabledImg = NULL; + mpFocusedImg = NULL; } wxBitmap* wxNewBitmapButton::GetStateLabel() { - if ( IsEnabled() ) - { - if ( mIsPressed ) - { - return mpPressedImg; - } - else - { - if ( mIsInFocus ) - { - if ( mHasFocusedBmp ) - - return mpFocusedImg; - else - return mpDepressedImg; - } - else - return mpDepressedImg; - } - } - else - return mpDisabledImg; + if ( IsEnabled() ) + { + if ( mIsPressed ) + { + return mpPressedImg; + } + else + { + if ( mIsInFocus ) + { + if ( mHasFocusedBmp ) + + return mpFocusedImg; + else + return mpDepressedImg; + } + else + return mpDepressedImg; + } + } + else + return mpDisabledImg; } static const unsigned char _gDisableImage[] = { 0x55,0xAA,0x55,0xAA, - 0x55,0xAA,0x55,0xAA, - 0x55,0xAA,0x55,0xAA, - 0x55,0xAA,0x55,0xAA - }; + 0x55,0xAA,0x55,0xAA, + 0x55,0xAA,0x55,0xAA, + 0x55,0xAA,0x55,0xAA + }; void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, - bool isEnabled, bool isPressed ) + bool isEnabled, bool isPressed ) { - if ( destBmp != 0 ) return; - - // render lables on-demand - - wxMemoryDC srcDc; - srcDc.SelectObject( *srcBmp ); - - bool hasText = ( mTextAlignment != NB_NO_TEXT ) && - ( mLabelText.length() != 0 ); - - bool hasImage = (mTextAlignment != NB_NO_IMAGE); - - wxSize destDim; - wxPoint txtPos; - wxPoint imgPos; - - if ( hasText ) - { - long txtWidth, txtHeight; - - srcDc.SetFont( wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT) ); - srcDc.GetTextExtent( mLabelText, &txtWidth, &txtHeight ); - - if ( mTextAlignment == NB_ALIGN_TEXT_RIGHT ) - { - destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth; - - destDim.y = - wxMax( srcBmp->GetHeight(), txtHeight ); - - txtPos.x = srcBmp->GetWidth() + mTextToLabelGap; - txtPos.y = (destDim.y - txtHeight)/2; - imgPos.x = 0; - imgPos.y = (destDim.y - srcBmp->GetHeight())/2; - } - else - if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM ) - { - destDim.x = - wxMax( srcBmp->GetWidth(), txtWidth ); - - destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight; - - txtPos.x = (destDim.x - txtWidth)/2; - txtPos.y = srcBmp->GetHeight() + mTextToLabelGap; - imgPos.x = (destDim.x - srcBmp->GetWidth())/2; - imgPos.y = 0; - } - else - { - int avoidCompilerWarning = 0; - wxASSERT(avoidCompilerWarning);// unsupported alignment type - } - } - else - { - imgPos.x = 0; - imgPos.y = 0; - destDim.x = srcBmp->GetWidth(); - destDim.y = srcBmp->GetHeight(); - } - - destBmp = new wxBitmap( int(destDim.x), int(destDim.y) ); - - wxMemoryDC destDc; - destDc.SelectObject( *destBmp ); - - wxBrush grayBrush( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE), wxSOLID ); - wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT ); - - destDc.SetBrush( grayBrush ); - destDc.SetPen( nullPen ); - - destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 ); - - if ( isPressed ) - { - ++imgPos.x; ++imgPos.y; - ++txtPos.x; ++txtPos.y; - } - - if ( hasImage ) - { - - destDc.Blit( imgPos.x, imgPos.y, - srcBmp->GetWidth()+1, - srcBmp->GetHeight()+1, - &srcDc, 0,0, wxCOPY,TRUE ); - } - - if ( hasText ) - { - wxWindow* pTopWnd = this; - - do - { - wxWindow* pParent = pTopWnd->GetParent(); - - if ( pParent == 0 ) - break; + if ( destBmp != 0 ) return; + + // render labels on-demand + + wxMemoryDC srcDc; + srcDc.SelectObject( *srcBmp ); + + bool hasText = ( mTextAlignment != NB_NO_TEXT ) && + ( mLabelText.length() != 0 ); + + bool hasImage = (mTextAlignment != NB_NO_IMAGE); + + wxSize destDim; + wxPoint txtPos; + wxPoint imgPos; - pTopWnd = pParent; - } while(1); + if ( hasText ) + { + long txtWidth, txtHeight; - destDc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT) ); + srcDc.SetFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) ); + srcDc.GetTextExtent( mLabelText, &txtWidth, &txtHeight ); - if ( isEnabled ) + if ( mTextAlignment == NB_ALIGN_TEXT_RIGHT ) { - destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNTEXT) ); - } + destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth; + + destDim.y = + wxMax( srcBmp->GetHeight(), txtHeight ); + + txtPos.x = srcBmp->GetWidth() + mTextToLabelGap; + txtPos.y = (destDim.y - txtHeight)/2; + imgPos.x = 0; + imgPos.y = (destDim.y - srcBmp->GetHeight())/2; + } else + if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM ) + { + destDim.x = + wxMax( srcBmp->GetWidth(), txtWidth ); + + destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight; + + txtPos.x = (destDim.x - txtWidth)/2; + txtPos.y = srcBmp->GetHeight() + mTextToLabelGap; + imgPos.x = (destDim.x - srcBmp->GetWidth())/2; + imgPos.y = 0; + } + else { - destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW) ); - } - destDc.SetTextBackground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE) ); + wxFAIL_MSG("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()"); + } + } + else + { + imgPos.x = 0; + imgPos.y = 0; + destDim.x = srcBmp->GetWidth(); + destDim.y = srcBmp->GetHeight(); + } + + destBmp = new wxBitmap( int(destDim.x), int(destDim.y) ); - destDc.DrawText( mLabelText, txtPos.x, txtPos.y ); - } + wxMemoryDC destDc; + destDc.SelectObject( *destBmp ); + wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID ); + wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT ); - destDc.SetBrush( grayBrush ); - destDc.SetPen( nullPen ); + destDc.SetBrush( grayBrush ); + destDc.SetPen( nullPen ); - destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 ); + destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 ); - if ( isPressed ) - { - ++imgPos.x; ++imgPos.y; - ++txtPos.x; ++txtPos.y; - } + if ( isPressed ) + { + ++imgPos.x; ++imgPos.y; + ++txtPos.x; ++txtPos.y; + } - if ( hasImage ) - { + if ( hasImage ) + { - destDc.Blit( imgPos.x, imgPos.y, - srcBmp->GetWidth()+1, - srcBmp->GetHeight()+1, - &srcDc, 0,0, wxCOPY,TRUE ); - } + destDc.Blit( imgPos.x, imgPos.y, + srcBmp->GetWidth()+1, + srcBmp->GetHeight()+1, + &srcDc, 0,0, wxCOPY,TRUE ); + } - if ( hasText ) - { - wxWindow* pTopWnd = this; + if ( hasText ) + { + wxWindow* pTopWnd = this; - do - { - wxWindow* pParent = pTopWnd->GetParent(); + do + { + wxWindow* pParent = pTopWnd->GetParent(); - if ( pParent == 0 ) + if ( pParent == 0 ) break; - pTopWnd = pParent; - } while(1); + pTopWnd = pParent; + } while (1); - destDc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT) ); + destDc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT) ); - if ( isEnabled ) + if ( isEnabled ) { - destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNTEXT) ); - } + destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT) ); + } else { - destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW) ); - } - destDc.SetTextBackground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE) ); + destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) ); + } + destDc.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) ); - destDc.DrawText( mLabelText, txtPos.x, txtPos.y ); - } + destDc.DrawText( mLabelText, txtPos.x, txtPos.y ); + } - if ( !isEnabled ){ - + if ( !isEnabled ){ + #ifdef __WXMSW__ // This is currently MSW specific - gray_out_image_on_dc( destDc, destDim.x, destDim.y ); + gray_out_image_on_dc( destDc, destDim.x, destDim.y ); #else - wxBrush checkerBrush( wxBitmap( (const char*)_gDisableImage,8,8) ); - checkerBrush.SetColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ) ); - destDc.SetBrush( checkerBrush ); - destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1); + wxBrush checkerBrush( wxBitmap( (const char*)_gDisableImage,8,8) ); + checkerBrush.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + destDc.SetBrush( checkerBrush ); + destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1); #endif - } - // adjust button size to fit the new dimensions of the label - if ( !mSizeIsSet && 0 ) - { - mSizeIsSet = TRUE; - SetSize( -1,-1, - destBmp->GetWidth() + mMarginX*2, - destBmp->GetHeight() + mMarginY*2, 0 - ); - } + } + // adjust button size to fit the new dimensions of the label + if ( !mSizeIsSet && 0 ) + { + mSizeIsSet = TRUE; + SetSize( -1,-1, + destBmp->GetWidth() + mMarginX*2, + destBmp->GetHeight() + mMarginY*2, 0 + ); + } + destDc.SelectObject( wxNullBitmap ); + +#ifdef __WXMSW__ + // Map to system colours + (void) MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight()); +#endif } + void wxNewBitmapButton::RenderAllLabelImages() { - if ( !mIsCreated ) + if ( !mIsCreated ) return; - RenderLabelImage( mpDisabledImg, &mDepressedBmp, FALSE ); - RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); - RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); - if ( mHasFocusedBmp ) + RenderLabelImage( mpDisabledImg, &mDepressedBmp, FALSE ); + RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); + RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); + if ( mHasFocusedBmp ) { - RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); - } + RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); + } } - + void wxNewBitmapButton::RenderLabelImages() { - if ( !mIsCreated ) + if ( !mIsCreated ) return; - if ( !IsEnabled() ) - { - RenderLabelImage( mpDisabledImg, &mDepressedBmp, FALSE ); - } - else - - if ( mIsPressed ) - - RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); - else - { - if ( mIsInFocus ) - { - if ( mHasFocusedBmp ) - RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); - else - RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); - } - else - RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); - } + if ( !IsEnabled() ) + { + RenderLabelImage( mpDisabledImg, &mDepressedBmp, FALSE ); + } + else + + if ( mIsPressed ) + + RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); + else + { + if ( mIsInFocus ) + { + if ( mHasFocusedBmp ) + RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); + else + RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); + } + else + RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); + } +} + +bool wxNewBitmapButton::Enable(bool enable) +{ + if ( enable != m_isEnabled ) + { + if ( mIsInFocus ) + { + mIsInFocus = FALSE; + } + + if ( mIsPressed ) + { + mIsPressed = FALSE; + } + + Refresh(); + } + + return wxPanel::Enable( enable ); } void wxNewBitmapButton::DrawDecorations( wxDC& dc ) { - if ( mIsFlat ) - { - DrawShade( 1, dc, mGrayPen, mGrayPen ); - - if ( mIsInFocus ) - { - if ( mIsPressed ) - DrawShade( 0, dc, mDarkPen, mLightPen ); - else - DrawShade( 0, dc, mLightPen, mDarkPen ); - } - else - DrawShade( 0, dc, mGrayPen, mGrayPen ); - } - else - { - if ( mIsPressed ) - { - DrawShade( 0, dc, mDarkPen, mGrayPen ); - DrawShade( 1, dc, mBlackPen, mLightPen ); - } - else - { - DrawShade( 0, dc, mGrayPen, mDarkPen ); - DrawShade( 1, dc, mLightPen, mBlackPen ); - } - } + if ( mIsFlat ) + { + DrawShade( 1, dc, mGrayPen, mGrayPen ); + + if ( mIsInFocus ) + { + if ( mIsPressed ) + DrawShade( 0, dc, mDarkPen, mLightPen ); + else + DrawShade( 0, dc, mLightPen, mDarkPen ); + } + else + DrawShade( 0, dc, mGrayPen, mGrayPen ); + } + else + { + if ( mIsPressed ) + { + DrawShade( 0, dc, mDarkPen, mGrayPen ); + DrawShade( 1, dc, mBlackPen, mLightPen ); + } + else + { + DrawShade( 0, dc, mGrayPen, mDarkPen ); + DrawShade( 1, dc, mLightPen, mBlackPen ); + } + } } void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap, - const wxString& labelText ) + const wxString& labelText ) { - DestroyLabels(); + DestroyLabels(); - mLabelText = labelText; - mDepressedBmp = labelBitmap; + mLabelText = labelText; + mDepressedBmp = labelBitmap; - //RenderLabelImages(); - RenderAllLabelImages(); + //RenderLabelImages(); + RenderAllLabelImages(); } void wxNewBitmapButton::SetAlignments( int alignText, - int marginX, - int marginY, - int textToLabelGap) + int marginX, + int marginY, + int textToLabelGap) { - DestroyLabels(); + DestroyLabels(); - mMarginX = marginX; - mMarginY = marginY; - mTextAlignment = alignText; - mTextToLabelGap = textToLabelGap; + mMarginX = marginX; + mMarginY = marginY; + mTextAlignment = alignText; + mTextToLabelGap = textToLabelGap; - //RenderLabelImages(); - RenderAllLabelImages(); + //RenderLabelImages(); + RenderAllLabelImages(); } // event handlers void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event ) { - mPrevPressedState = FALSE; - mDragStarted = TRUE; - mIsPressed = TRUE; - Refresh(); - - if ( !mIsInFocus ) - CaptureMouse(); + mDragStarted = TRUE; + mIsPressed = TRUE; + Refresh(); } void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event ) { - if ( !mDragStarted ) + if ( !mDragStarted ) return; - mDragStarted = FALSE; - mIsPressed = FALSE; - mIsInFocus = FALSE; - Refresh(); + mDragStarted = FALSE; + mIsPressed = FALSE; + Refresh(); - ReleaseMouse(); + if ( IsInWindow( event.m_x, event.m_y ) ) + { + // fire event, if mouse was released + // within the bounds of button + wxCommandEvent cmd( mFiredEventType, GetId() ); + GetParent()->ProcessEvent( cmd ); + } +} - if ( IsInWindow( event.m_x, event.m_y ) ) - { - // fire event, if mouse was released - // within the bounds of button - wxCommandEvent cmd( mFiredEventType, GetId() ); - GetParent()->ProcessEvent( cmd ); - } +void wxNewBitmapButton::OnLButtonDClick( wxMouseEvent& event ) +{ + if ( IsInWindow( event.m_x, event.m_y ) ) + { + // fire event, if mouse was released + // within the bounds of button + wxCommandEvent cmd( mFiredEventType, GetId() ); + GetParent()->ProcessEvent( cmd ); + + mDragStarted = FALSE; + mIsPressed = FALSE; + Refresh(); + } } bool wxNewBitmapButton::IsInWindow( int x, int y ) { - int width, height; - GetSize( &width, &height ); + int width, height; + GetSize( &width, &height ); + + return ( x >= 0 && y >= 0 && + x < width && + y < height ); +} + +void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& event ) +{ + bool prevIsInFocus = mIsInFocus; - return ( x >= 0 && y >= 0 && - x < width && - y < height ); + if ( !mIsInFocus ) + { + mIsInFocus = TRUE; + } + if ( prevIsInFocus != mIsInFocus ) + { + Refresh(); + } } -void wxNewBitmapButton::OnMouseMove( wxMouseEvent& event ) +void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& event ) { - mPrevPressedState=mIsPressed; - mPrevInFocusState=mIsInFocus; - if ( !mIsInFocus && IsInWindow( event.m_x, event.m_y ) ) - { - if ( !mDragStarted ) - CaptureMouse(); - - mIsInFocus = TRUE; - } - else - if ( mIsInFocus && !IsInWindow( event.m_x, event.m_y ) ) - { - mIsInFocus = FALSE; - - if ( !mDragStarted ) - ReleaseMouse(); - } - - if ( mDragStarted ) - { - if ( IsInWindow( event.m_x, event.m_y ) ) - - mIsPressed = TRUE; - else - mIsPressed = FALSE; - } - - if ((mIsPressed != mPrevPressedState) || - (mIsInFocus!=mPrevInFocusState)) + bool prevIsInFocus = mIsInFocus; + bool prevIsPressed = mIsPressed; + if ( mIsInFocus ) + { + mIsInFocus = FALSE; + mIsPressed = FALSE; + } + if ( prevIsInFocus != mIsInFocus || prevIsPressed != mIsPressed ) { - Refresh(); - } + Refresh(); + } } void wxNewBitmapButton::OnSize( wxSizeEvent& event ) { - //Reshape(); + //Reshape(); } void wxNewBitmapButton::Reshape( ) -{ - - bool wasCreated = mIsCreated; - mIsCreated = TRUE; +{ + bool wasCreated = mIsCreated; + mIsCreated = TRUE; - if ( !wasCreated ) - { - // in the case of loading button from stream, check if we - // have non-empty image-file name, load if possible + if ( !wasCreated ) + { + // in the case of loading button from stream, check if we + // have non-empty image-file name, load if possible - if ( mImageFileName != "" ) - { - mDepressedBmp.LoadFile( mImageFileName, mImageFileType ); + if ( mImageFileName != "" ) + { + mDepressedBmp.LoadFile( mImageFileName, mImageFileType ); - //wxMessageBox("Image Loaded!!!"); - } + //wxMessageBox("Image Loaded!!!"); + } - //RenderLabelImages(); - RenderAllLabelImages(); + //RenderLabelImages(); + RenderAllLabelImages(); - wxBitmap* pCurImg = GetStateLabel(); + wxBitmap* pCurImg = GetStateLabel(); - int w = pCurImg->GetWidth(), - h = pCurImg->GetHeight(); + int w = pCurImg->GetWidth(), + h = pCurImg->GetHeight(); - SetSize( 0,0, w + mMarginX*2, h + mMarginY*2 , 0 ); - } + SetSize( 0,0, w + mMarginX*2, h + mMarginY*2 , 0 ); + } } void wxNewBitmapButton::DrawLabel( wxDC& dc ) { - wxBitmap* pCurBmp = GetStateLabel(); + wxBitmap* pCurBmp = GetStateLabel(); - if ( pCurBmp == NULL ) - { - wxSizeEvent evt; - OnSize( evt ); // fake it up! + if ( pCurBmp == NULL ) + { + wxSizeEvent evt; + OnSize( evt ); // fake it up! - //RenderLabelImages(); - pCurBmp = GetStateLabel(); - } + //RenderLabelImages(); + pCurBmp = GetStateLabel(); + } - wxMemoryDC mdc; - mdc.SelectObject( *pCurBmp ); + wxMemoryDC mdc; + mdc.SelectObject( *pCurBmp ); - dc.Blit( mMarginX, mMarginY, - pCurBmp->GetWidth(), - pCurBmp->GetHeight(), - &mdc, 0,0, wxCOPY - ); + dc.Blit( mMarginX, mMarginY, + pCurBmp->GetWidth(), + pCurBmp->GetHeight(), + &mdc, 0,0, wxCOPY + ); - mdc.SelectObject( wxNullBitmap ); + mdc.SelectObject( wxNullBitmap ); } void wxNewBitmapButton::OnPaint( wxPaintEvent& event ) { - wxPaintDC dc(this); + wxPaintDC dc(this); - // first, make sure images for current state are prepared - //RenderLabelImages(); + // first, make sure images for current state are prepared + //RenderLabelImages(); - DrawLabel( dc ); + DrawLabel( dc ); - DrawDecorations( dc ); + DrawDecorations( dc ); } void wxNewBitmapButton::OnEraseBackground( wxEraseEvent& event ) { - // do nothing + // do nothing } void wxNewBitmapButton::OnKillFocus( wxFocusEvent& event ) { - // useless + // useless - wxMessageBox("kill-focus for button!"); + wxMessageBox("kill-focus for button!"); } +#ifdef __WXMSW__ +WXHBITMAP wxNewBitmapButton::MapBitmap(WXHBITMAP bitmap, int width, int height) +{ + MemoryHDC hdcMem; + + if ( !hdcMem ) + { + wxLogLastError(_T("CreateCompatibleDC")); + + return bitmap; + } + + SelectInHDC bmpInHDC(hdcMem, (HBITMAP)bitmap); + + if ( !bmpInHDC ) + { + wxLogLastError(_T("SelectObject")); + + return bitmap; + } + + wxCOLORMAP *cmap = wxGetStdColourMap(); + + for ( int i = 0; i < width; i++ ) + { + for ( int j = 0; j < height; j++ ) + { + COLORREF pixel = ::GetPixel(hdcMem, i, j); + + for ( size_t k = 0; k < wxSTD_COL_MAX; k++ ) + { + COLORREF col = cmap[k].from; + if ( abs(GetRValue(pixel) - GetRValue(col)) < 10 && + abs(GetGValue(pixel) - GetGValue(col)) < 10 && + abs(GetBValue(pixel) - GetBValue(col)) < 10 ) + { + ::SetPixel(hdcMem, i, j, cmap[k].to); + break; + } + } + } + } + + return bitmap; +} +#endif