X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5515f252cb0a46c2a200a14f0692e6db7c3aea47..b2c13097deb7736a86a278c02d0b3f7cd9873750:/contrib/src/fl/newbmpbtn.cpp diff --git a/contrib/src/fl/newbmpbtn.cpp b/contrib/src/fl/newbmpbtn.cpp index 5cfdd6d637..9defbfe9a8 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,6 +27,10 @@ #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 ) @@ -47,14 +51,14 @@ 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_BLUE(col) (col >> 16) & 0xFF +#define GET_RED(col) col & 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) \ - ) + ) #define IS_GREATER(col1,col2) ( ( (GET_RED(col1) ) > (GET_RED(col2) ) + MIN_COLOR_DIFF ) && \ ( (GET_GREEN(col1)) > (GET_GREEN(col2)) + MIN_COLOR_DIFF ) && \ @@ -97,7 +101,7 @@ static void gray_out_pixmap( int* src, int* dest, int width, int height ) 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 ) @@ -110,14 +114,14 @@ static void gray_out_pixmap( int* src, int* dest, int width, int height ) // go zig-zag - if ( IS_IN_ARRAY(x+1,y-1) ) + if ( IS_IN_ARRAY(x+1,y-1) ) { ++x; --y; } else { - while ( IS_IN_ARRAY(x-1,y+1) ) + while ( IS_IN_ARRAY(x-1,y+1) ) { --x; ++y; @@ -142,7 +146,7 @@ static void gray_out_pixmap( int* src, int* dest, int width, int height ) } 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 ) @@ -151,8 +155,8 @@ void gray_out_image_on_dc( wxDC& dc, int width, int height ) 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 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 ); @@ -179,13 +183,13 @@ void gray_out_image_on_dc( wxDC& dc, int width, int height ) switch (mask) { - case MASK_BG : { dc.SetPen( bgPen ); + case MASK_BG : { dc.SetPen( bgPen ); dc.DrawPoint( x,y ); break; } - case MASK_DARK : { dc.SetPen( darkPen ); + case MASK_DARK : { dc.SetPen( darkPen ); dc.DrawPoint( x,y ); break; } - case MASK_LIGHT : { dc.SetPen( lightPen ); + case MASK_LIGHT : { dc.SetPen( lightPen ); dc.DrawPoint( x,y ); break; } default : break; @@ -198,15 +202,18 @@ void gray_out_image_on_dc( wxDC& dc, int width, int height ) /////////////////////////////// -/***** 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_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDown ) + EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter ) + EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave ) EVT_SIZE ( wxNewBitmapButton::OnSize ) EVT_PAINT( wxNewBitmapButton::OnPaint ) @@ -215,13 +222,15 @@ BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel ) EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground ) + EVT_IDLE(wxNewBitmapButton::OnIdle) + END_EVENT_TABLE() -wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap, +wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap, const wxString& labelText, int alignText, bool isFlat, - int firedEventType, + int firedEventType, int marginX, int marginY, int textToLabelGap, @@ -242,21 +251,20 @@ wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap, mpFocusedImg ( NULL ), - mDragStarted ( FALSE ), - mIsPressed ( FALSE ), - mIsInFocus( FALSE ), - mPrevPressedState( FALSE ), - mPrevInFocusState( FALSE ), - mHasFocusedBmp( FALSE ), + mDragStarted ( false ), + mIsPressed ( false ), + mIsInFocus ( false ), + mIsToggled ( 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 ), + 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 ) + mIsCreated( false ), + mSizeIsSet( false ) { } @@ -266,17 +274,17 @@ wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName, const wxString& labelText, int alignText, bool isFlat, - int firedEventType, - int marginX, - int marginY, - int textToLabelGap, - bool isSticky) + int WXUNUSED(firedEventType), + int WXUNUSED(marginX), + int WXUNUSED(marginY), + int WXUNUSED(textToLabelGap), + bool WXUNUSED(isSticky)) : mTextToLabelGap ( 2 ), mMarginX( 2 ), mMarginY( 2 ), mTextAlignment( alignText ), - mIsSticky( FALSE ), + mIsSticky( false ), mIsFlat( isFlat ), mLabelText( labelText ), mImageFileName( bitmapFileName ), @@ -287,26 +295,25 @@ wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName, mpDisabledImg ( NULL ), mpFocusedImg ( NULL ), - mDragStarted ( FALSE ), - mIsPressed ( FALSE ), - mIsInFocus ( FALSE ), - mPrevPressedState( FALSE ), - mPrevInFocusState( FALSE ), - mHasFocusedBmp( FALSE ), + mDragStarted ( false ), + mIsPressed ( false ), + mIsInFocus ( false ), + mIsToggled ( 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 ), + 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 ) + mIsCreated( false ), + mSizeIsSet( false ) { } -wxNewBitmapButton::~wxNewBitmapButton(void) +wxNewBitmapButton::~wxNewBitmapButton(void) { DestroyLabels(); } @@ -318,11 +325,11 @@ void wxNewBitmapButton::DrawShade( int outerLevel, { wxBitmap* pBmp = GetStateLabel(); - int x = mMarginX - (outerLevel + 1); - int y = mMarginY - (outerLevel + 1); + int x = mMarginX - (outerLevel + 2); + int y = mMarginY - (outerLevel + 2); - int height = pBmp->GetHeight() + (outerLevel + 1)*2 - 1; - int width = pBmp->GetWidth() + (outerLevel + 1)*2 - 1; + int height = pBmp->GetHeight() + (outerLevel + 2)*2 - 1; + int width = pBmp->GetWidth() + (outerLevel + 2)*2 - 1; dc.SetPen( upperLeftSidePen ); dc.DrawLine( x,y, x + width, y ); @@ -372,17 +379,22 @@ wxBitmap* wxNewBitmapButton::GetStateLabel() return mpDisabledImg; } +#ifndef __WXMSW__ + static const unsigned char _gDisableImage[] = { 0x55,0xAA,0x55,0xAA, 0x55,0xAA,0x55,0xAA, 0x55,0xAA,0x55,0xAA, 0x55,0xAA,0x55,0xAA }; + +#endif + void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, bool isEnabled, bool isPressed ) { if ( destBmp != 0 ) return; - // render lables on-demand + // render labels on-demand wxMemoryDC srcDc; srcDc.SelectObject( *srcBmp ); @@ -400,14 +412,14 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, { long txtWidth, txtHeight; - srcDc.SetFont( wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT) ); + srcDc.SetFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) ); srcDc.GetTextExtent( mLabelText, &txtWidth, &txtHeight ); if ( mTextAlignment == NB_ALIGN_TEXT_RIGHT ) { destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth; - destDim.y = + destDim.y = wxMax( srcBmp->GetHeight(), txtHeight ); txtPos.x = srcBmp->GetWidth() + mTextToLabelGap; @@ -418,7 +430,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, else if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM ) { - destDim.x = + destDim.x = wxMax( srcBmp->GetWidth(), txtWidth ); destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight; @@ -428,9 +440,9 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, imgPos.x = (destDim.x - srcBmp->GetWidth())/2; imgPos.y = 0; } - else + else { - wxFAIL_MSG("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()"); + wxFAIL_MSG(wxT("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()")); } } else @@ -446,12 +458,10 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, wxMemoryDC destDc; destDc.SelectObject( *destBmp ); - wxBrush grayBrush( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE), wxSOLID ); - wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT ); + wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID ); destDc.SetBrush( grayBrush ); - destDc.SetPen( nullPen ); - + destDc.SetPen( *wxTRANSPARENT_PEN ); destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 ); if ( isPressed ) @@ -463,10 +473,10 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, 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(), + srcBmp->GetHeight(), + &srcDc, 0,0, wxCOPY,true ); } if ( hasText ) @@ -483,78 +493,28 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, pTopWnd = pParent; } while (1); - destDc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT) ); + destDc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT) ); 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.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) ); } - destDc.SetTextBackground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE) ); - - destDc.DrawText( mLabelText, txtPos.x, txtPos.y ); - } - - - 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; - - pTopWnd = pParent; - } while (1); - - destDc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT) ); - - if ( isEnabled ) - { - destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNTEXT) ); - } - else - { - destDc.SetTextForeground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW) ); - } - destDc.SetTextBackground( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE) ); + destDc.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) ); destDc.DrawText( mLabelText, txtPos.x, txtPos.y ); } if ( !isEnabled ){ - + #ifdef __WXMSW__ // This is currently MSW specific 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 ) ); + checkerBrush.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); destDc.SetBrush( checkerBrush ); destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1); #endif @@ -562,26 +522,33 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, // adjust button size to fit the new dimensions of the label if ( !mSizeIsSet && 0 ) { - mSizeIsSet = TRUE; - SetSize( -1,-1, + mSizeIsSet = true; + SetSize( wxDefaultCoord, wxDefaultCoord, destBmp->GetWidth() + mMarginX*2, - destBmp->GetHeight() + mMarginY*2, 0 + destBmp->GetHeight() + mMarginY*2, 0 ); } + destDc.SelectObject( wxNullBitmap ); + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + // Map to system colours + (void) wxToolBar::MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight()); +#endif } + void wxNewBitmapButton::RenderAllLabelImages() { if ( !mIsCreated ) return; - RenderLabelImage( mpDisabledImg, &mDepressedBmp, FALSE ); - RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); - RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); + 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() { @@ -590,25 +557,58 @@ void wxNewBitmapButton::RenderLabelImages() if ( !IsEnabled() ) { - RenderLabelImage( mpDisabledImg, &mDepressedBmp, FALSE ); + RenderLabelImage( mpDisabledImg, &mDepressedBmp, false ); } else - if ( mIsPressed ) + if ( mIsPressed ) - RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); + RenderLabelImage( mpPressedImg, &mDepressedBmp, true, true ); else { if ( mIsInFocus ) { if ( mHasFocusedBmp ) - RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); + RenderLabelImage( mpFocusedImg, &mFocusedBmp, true, false ); else - RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); + RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false ); } else - RenderLabelImage( mpDepressedImg, &mDepressedBmp, TRUE, FALSE ); + RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false ); + } +} + +bool wxNewBitmapButton::Toggle(bool enable) +{ + if ( mIsToggled == enable ) + { + return false; + } + + mIsToggled = enable; + Refresh(); + + return true; +} + +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 ) @@ -616,8 +616,11 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc ) if ( mIsFlat ) { DrawShade( 1, dc, mGrayPen, mGrayPen ); - - if ( mIsInFocus ) + if ( mIsToggled ) + { + DrawShade( 0, dc, mDarkPen, mLightPen ); + } + else if ( mIsInFocus ) { if ( mIsPressed ) DrawShade( 0, dc, mDarkPen, mLightPen ); @@ -629,7 +632,7 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc ) } else { - if ( mIsPressed ) + if ( mIsPressed || mIsToggled ) { DrawShade( 0, dc, mDarkPen, mGrayPen ); DrawShade( 1, dc, mBlackPen, mLightPen ); @@ -642,7 +645,7 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc ) } } -void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap, +void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap, const wxString& labelText ) { DestroyLabels(); @@ -672,15 +675,11 @@ void wxNewBitmapButton::SetAlignments( int alignText, // event handlers -void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event ) +void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& WXUNUSED(event) ) { - mPrevPressedState = FALSE; - mDragStarted = TRUE; - mIsPressed = TRUE; + mDragStarted = true; + mIsPressed = true; Refresh(); - - if ( !mIsInFocus ) - CaptureMouse(); } void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event ) @@ -688,14 +687,11 @@ void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event ) if ( !mDragStarted ) return; - mDragStarted = FALSE; - mIsPressed = FALSE; - mIsInFocus = FALSE; + mDragStarted = false; + mIsPressed = false; Refresh(); - ReleaseMouse(); - - if ( IsInWindow( event.m_x, event.m_y ) ) + if ( IsInWindow( event.m_x, event.m_y ) ) { // fire event, if mouse was released // within the bounds of button @@ -714,59 +710,51 @@ bool wxNewBitmapButton::IsInWindow( int x, int y ) y < height ); } -void wxNewBitmapButton::OnMouseMove( wxMouseEvent& event ) +void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& WXUNUSED(event) ) { - mPrevPressedState=mIsPressed; - mPrevInFocusState=mIsInFocus; - if ( !mIsInFocus && IsInWindow( event.m_x, event.m_y ) ) - { - if ( !mDragStarted ) - CaptureMouse(); + bool prevIsInFocus = mIsInFocus; - mIsInFocus = TRUE; + if ( !mIsInFocus ) + { + mIsInFocus = true; } - else - if ( mIsInFocus && !IsInWindow( event.m_x, event.m_y ) ) + if ( prevIsInFocus != mIsInFocus ) { - mIsInFocus = FALSE; - - if ( !mDragStarted ) - ReleaseMouse(); + Refresh(); } +} - if ( mDragStarted ) +void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& WXUNUSED(event) ) +{ + bool prevIsInFocus = mIsInFocus; + bool prevIsPressed = mIsPressed; + if ( mIsInFocus ) { - if ( IsInWindow( event.m_x, event.m_y ) ) - - mIsPressed = TRUE; - else - mIsPressed = FALSE; + mIsInFocus = false; + mIsPressed = false; } - - if ((mIsPressed != mPrevPressedState) || - (mIsInFocus!=mPrevInFocusState)) + if ( prevIsInFocus != mIsInFocus || prevIsPressed != mIsPressed ) { Refresh(); } } -void wxNewBitmapButton::OnSize( wxSizeEvent& event ) +void wxNewBitmapButton::OnSize( wxSizeEvent& WXUNUSED(event) ) { //Reshape(); } void wxNewBitmapButton::Reshape( ) { - bool wasCreated = mIsCreated; - mIsCreated = TRUE; + mIsCreated = true; if ( !wasCreated ) { // in the case of loading button from stream, check if we - // have non-empty image-file name, load if possible + // have non-empty image-file name, load if possible - if ( mImageFileName != "" ) + if (!mImageFileName.empty()) { mDepressedBmp.LoadFile( mImageFileName, mImageFileType ); @@ -801,16 +789,16 @@ void wxNewBitmapButton::DrawLabel( wxDC& dc ) wxMemoryDC mdc; mdc.SelectObject( *pCurBmp ); - dc.Blit( mMarginX, mMarginY, + dc.Blit( mMarginX, mMarginY, pCurBmp->GetWidth(), pCurBmp->GetHeight(), - &mdc, 0,0, wxCOPY + &mdc, 0,0, wxCOPY ); mdc.SelectObject( wxNullBitmap ); } -void wxNewBitmapButton::OnPaint( wxPaintEvent& event ) +void wxNewBitmapButton::OnPaint( wxPaintEvent& WXUNUSED(event) ) { wxPaintDC dc(this); @@ -822,15 +810,44 @@ void wxNewBitmapButton::OnPaint( wxPaintEvent& event ) DrawDecorations( dc ); } -void wxNewBitmapButton::OnEraseBackground( wxEraseEvent& event ) +void wxNewBitmapButton::OnEraseBackground( wxEraseEvent& WXUNUSED(event) ) { // do nothing } -void wxNewBitmapButton::OnKillFocus( wxFocusEvent& event ) +void wxNewBitmapButton::OnKillFocus( wxFocusEvent& WXUNUSED(event) ) { // useless - wxMessageBox("kill-focus for button!"); + wxMessageBox(wxT("kill-focus for button!")); +} + +// ---------------------------------------------------------------------------- +// UI updates +// ---------------------------------------------------------------------------- + +void wxNewBitmapButton::OnIdle(wxIdleEvent& event) +{ + DoButtonUpdate(); + + event.Skip(); } +// Do the toolbar button updates (check for EVT_UPDATE_UI handlers) +void wxNewBitmapButton::DoButtonUpdate() +{ + wxUpdateUIEvent event(GetId()); + event.SetEventObject(this); + + if ( GetParent()->ProcessEvent(event) ) + { + if ( event.GetSetEnabled() ) + { + bool enabled = event.GetEnabled(); + if ( enabled != IsEnabled() ) + Enable( enabled ); + } + if ( event.GetSetChecked() ) + Toggle( event.GetChecked() ); + } +}