// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
- #pragma implementation "newbmpbtn.h"
-#endif
-
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#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 )
#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 ) && \
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 )
// 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;
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;
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 )
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,
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 ),
mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),
mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ),
- mIsCreated( FALSE ),
- mSizeIsSet( FALSE )
+ mIsCreated( false ),
+ mSizeIsSet( false )
{
}
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 ),
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 ),
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();
}
wxPen& lowerRightSidePen )
{
wxBitmap* pBmp = GetStateLabel();
-
- 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 x = mMarginX - (outerLevel + 2);
+ int y = mMarginY - (outerLevel + 2);
+ 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 );
dc.DrawLine( x,y, x, y + height );
+ dc.DrawLine( x,y+1, x + width , y +1 ); // top
+ dc.DrawLine( x+1,y, x+1, y + height ); // left
dc.SetPen( lowerRightSidePen );
dc.DrawLine( x + width, y, x + width, y + height + 1 );
dc.DrawLine( x, y + height, x + width, y + height );
+ dc.DrawLine( x + width-1, y+1, x + width-1, y + height +1 ); // right
+ dc.DrawLine( x +1, y + height-1, x + width, y + height-1 ); // bottom
}
void wxNewBitmapButton::DestroyLabels()
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 )
{
{
destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth;
- destDim.y =
+ destDim.y =
wxMax( srcBmp->GetHeight(), txtHeight );
txtPos.x = srcBmp->GetWidth() + mTextToLabelGap;
else
if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM )
{
- destDim.x =
+ destDim.x =
wxMax( srcBmp->GetWidth(), txtWidth );
destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight;
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
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.SetPen( *wxTRANSPARENT_PEN );
destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 );
if ( isPressed )
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::GetFont( wxSYS_DEFAULT_GUI_FONT) );
-
- if ( isEnabled )
- {
- destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT) );
- }
- else
- {
- destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) );
- }
- destDc.SetTextBackground( wxSystemSettings::GetColour(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 );
+ destDc.Blit( imgPos.x, imgPos.y,
+ srcBmp->GetWidth(),
+ srcBmp->GetHeight(),
+ &srcDc, 0,0, wxCOPY,true );
}
if ( hasText )
}
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) );
+ wxBitmap bmp( (const char*)_gDisableImage,8,8);
+ wxBrush checkerBrush(bmp);
checkerBrush.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
destDc.SetBrush( checkerBrush );
destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1);
// 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()
{
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 )
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 );
}
else
{
- if ( mIsPressed )
+ if ( mIsPressed || mIsToggled )
{
DrawShade( 0, dc, mDarkPen, mGrayPen );
DrawShade( 1, dc, mBlackPen, mLightPen );
}
}
-void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap,
+void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap,
const wxString& labelText )
{
DestroyLabels();
// 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 )
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
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 );
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);
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() );
+ }
+}