X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45da7759b82ec09ade8236a17f822dc54c5e5483..d1a6e2b7a103d761fbc15e0e9c1c20ab53a849d9:/contrib/src/fl/newbmpbtn.cpp?ds=sidebyside diff --git a/contrib/src/fl/newbmpbtn.cpp b/contrib/src/fl/newbmpbtn.cpp index b811e40c12..dbec38e40d 100644 --- a/contrib/src/fl/newbmpbtn.cpp +++ b/contrib/src/fl/newbmpbtn.cpp @@ -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 ) @@ -206,7 +210,8 @@ BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel ) EVT_LEFT_DOWN ( wxNewBitmapButton::OnLButtonDown ) EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp ) - EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick ) +// EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick ) + EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDown ) EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter ) EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave ) @@ -217,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, @@ -244,9 +251,10 @@ wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap, mpFocusedImg ( NULL ), - mDragStarted ( FALSE ), - mIsPressed ( FALSE ), - mIsInFocus( FALSE ), + mDragStarted ( FALSE ), + mIsPressed ( FALSE ), + mIsInFocus ( FALSE ), + mIsToggled ( FALSE ), mHasFocusedBmp( FALSE ), mFiredEventType( firedEventType ), @@ -266,11 +274,11 @@ 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 ), @@ -287,9 +295,10 @@ wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName, mpDisabledImg ( NULL ), mpFocusedImg ( NULL ), - mDragStarted ( FALSE ), - mIsPressed ( FALSE ), - mIsInFocus ( FALSE ), + mDragStarted ( FALSE ), + mIsPressed ( FALSE ), + mIsInFocus ( FALSE ), + mIsToggled ( FALSE ), mHasFocusedBmp( FALSE ), mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ), @@ -316,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 ); @@ -405,7 +414,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, { destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth; - destDim.y = + destDim.y = wxMax( srcBmp->GetHeight(), txtHeight ); txtPos.x = srcBmp->GetWidth() + mTextToLabelGap; @@ -416,7 +425,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; @@ -426,9 +435,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 @@ -461,7 +470,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, if ( hasImage ) { - destDc.Blit( imgPos.x, imgPos.y, + destDc.Blit( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1, &srcDc, 0,0, wxCOPY,TRUE ); @@ -497,7 +506,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp, } if ( !isEnabled ){ - + #ifdef __WXMSW__ // This is currently MSW specific gray_out_image_on_dc( destDc, destDim.x, destDim.y ); #else @@ -510,13 +519,20 @@ 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( -1,-1, 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 ) @@ -529,7 +545,7 @@ void wxNewBitmapButton::RenderAllLabelImages() RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); } } - + void wxNewBitmapButton::RenderLabelImages() { @@ -542,7 +558,7 @@ void wxNewBitmapButton::RenderLabelImages() } else - if ( mIsPressed ) + if ( mIsPressed ) RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); else @@ -559,6 +575,19 @@ void wxNewBitmapButton::RenderLabelImages() } } +bool wxNewBitmapButton::Toggle(bool enable) +{ + if ( mIsToggled == enable ) + { + return FALSE; + } + + mIsToggled = enable; + Refresh(); + + return TRUE; +} + bool wxNewBitmapButton::Enable(bool enable) { if ( enable != m_isEnabled ) @@ -584,8 +613,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 ); @@ -597,7 +629,7 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc ) } else { - if ( mIsPressed ) + if ( mIsPressed || mIsToggled ) { DrawShade( 0, dc, mDarkPen, mGrayPen ); DrawShade( 1, dc, mBlackPen, mLightPen ); @@ -610,7 +642,7 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc ) } } -void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap, +void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap, const wxString& labelText ) { DestroyLabels(); @@ -640,7 +672,7 @@ void wxNewBitmapButton::SetAlignments( int alignText, // event handlers -void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event ) +void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& WXUNUSED(event) ) { mDragStarted = TRUE; mIsPressed = TRUE; @@ -665,21 +697,6 @@ void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event ) } } -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; @@ -690,7 +707,7 @@ bool wxNewBitmapButton::IsInWindow( int x, int y ) y < height ); } -void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& event ) +void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& WXUNUSED(event) ) { bool prevIsInFocus = mIsInFocus; @@ -704,7 +721,7 @@ void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& event ) } } -void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& event ) +void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& WXUNUSED(event) ) { bool prevIsInFocus = mIsInFocus; bool prevIsPressed = mIsPressed; @@ -719,7 +736,7 @@ void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& event ) } } -void wxNewBitmapButton::OnSize( wxSizeEvent& event ) +void wxNewBitmapButton::OnSize( wxSizeEvent& WXUNUSED(event) ) { //Reshape(); } @@ -734,7 +751,7 @@ void wxNewBitmapButton::Reshape( ) // in the case of loading button from stream, check if we // have non-empty image-file name, load if possible - if ( mImageFileName != "" ) + if ( mImageFileName != wxT("") ) { mDepressedBmp.LoadFile( mImageFileName, mImageFileType ); @@ -778,7 +795,7 @@ void wxNewBitmapButton::DrawLabel( wxDC& dc ) mdc.SelectObject( wxNullBitmap ); } -void wxNewBitmapButton::OnPaint( wxPaintEvent& event ) +void wxNewBitmapButton::OnPaint( wxPaintEvent& WXUNUSED(event) ) { wxPaintDC dc(this); @@ -790,15 +807,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() ); + } +}