]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/fl/newbmpbtn.cpp
Warning fixes after recent library changes.
[wxWidgets.git] / contrib / src / fl / newbmpbtn.cpp
index 5cfdd6d637039a40c45dc1ce255220db48f524ef..9defbfe9a8056135c5f3824e7a0dfc160a6cecd5 100644 (file)
@@ -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__
 #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() );
+    }
+}