]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/fl/newbmpbtn.cpp
use full 32bit range for the process ids
[wxWidgets.git] / contrib / src / fl / newbmpbtn.cpp
index 5cfdd6d637039a40c45dc1ce255220db48f524ef..138e9cf1c673f85d1d18b1bb739edeec1494967d 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 )
@@ -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 );
@@ -198,15 +202,17 @@ 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_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter    )
+    EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave    )
 
     EVT_SIZE ( wxNewBitmapButton::OnSize  )
     EVT_PAINT( wxNewBitmapButton::OnPaint )
@@ -245,15 +251,13 @@ wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap,
         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 ),
+        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 )
@@ -290,15 +294,13 @@ wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName,
         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 ),
+        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 )
@@ -382,7 +384,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
 {
     if ( destBmp != 0 ) return;
 
-    // render lables on-demand
+    // render labels on-demand
 
     wxMemoryDC srcDc;
     srcDc.SelectObject( *srcBmp );
@@ -400,7 +402,7 @@ 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 )
@@ -446,7 +448,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
     wxMemoryDC destDc;
     destDc.SelectObject( *destBmp );
 
-    wxBrush grayBrush( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE), wxSOLID );
+    wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID );
     wxPen   nullPen( wxColour(0,0,0), 1, wxTRANSPARENT );
 
     destDc.SetBrush( grayBrush );
@@ -483,67 +485,17 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
             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.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) );
+        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.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) );
 
         destDc.DrawText( mLabelText, txtPos.x, txtPos.y );
     }
@@ -554,7 +506,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
         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
@@ -568,7 +520,14 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
                  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 )
@@ -611,6 +570,26 @@ void wxNewBitmapButton::RenderLabelImages()
     }
 }
 
+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 )
@@ -674,13 +653,9 @@ void wxNewBitmapButton::SetAlignments( int alignText,
 
 void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event )
 {
-    mPrevPressedState = FALSE;   
     mDragStarted      = TRUE;
     mIsPressed        = TRUE;
     Refresh();
-
-    if ( !mIsInFocus )
-            CaptureMouse();
 }
 
 void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
@@ -690,17 +665,29 @@ void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
 
     mDragStarted = FALSE;
     mIsPressed   = FALSE;
-    mIsInFocus   = 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 );
+    }
+}
 
+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();
     }
 }
 
@@ -714,37 +701,30 @@ bool wxNewBitmapButton::IsInWindow( int x, int y )
              y < height );
 }
 
-void wxNewBitmapButton::OnMouseMove( wxMouseEvent& event )
+void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& event )
 {
-    mPrevPressedState=mIsPressed;
-    mPrevInFocusState=mIsInFocus;
-    if ( !mIsInFocus && IsInWindow( event.m_x, event.m_y ) )
-    {
-        if ( !mDragStarted )
-            CaptureMouse();
+    bool prevIsInFocus = mIsInFocus;
 
+    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& 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();
     }
@@ -756,8 +736,7 @@ void wxNewBitmapButton::OnSize( wxSizeEvent& event )
 }
 
 void wxNewBitmapButton::Reshape( )
-{
-    
+{   
     bool wasCreated = mIsCreated;
     mIsCreated = TRUE;
 
@@ -834,3 +813,49 @@ void wxNewBitmapButton::OnKillFocus( wxFocusEvent& event )
     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