]> git.saurik.com Git - wxWidgets.git/blame - contrib/src/fl/newbmpbtn.cpp
added except sample
[wxWidgets.git] / contrib / src / fl / newbmpbtn.cpp
CommitLineData
8e08b761 1/////////////////////////////////////////////////////////////////////////////
4cbc57f0
JS
2// Name: newbmpbtn.cpp
3// Purpose: wxNewBitmapButton enhanced bitmap button class.
8e08b761
JS
4// Author: Aleksandras Gluchovas
5// Modified by:
6// Created: ??/09/98
7// RCS-ID: $Id$
8// Copyright: (c) Aleksandras Gluchovas
4cbc57f0 9// Licence: wxWindows licence
8e08b761
JS
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13 #pragma implementation "newbmpbtn.h"
14#endif
15
16// For compilers that support precompilation, includes "wx/wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include "wx/wx.h"
25#endif
26
27#include "wx/fl/newbmpbtn.h"
28#include "wx/utils.h" // import wxMin,wxMax macros
29
65e50848
JS
30#ifdef __WXMSW__
31#include "wx/msw/private.h"
32#endif
33
8e08b761
JS
34///////////// button-label rendering helpers //////////////////
35
36static int* create_array( int width, int height, int fill = 0 )
37{
5515f252 38 int* array = new int[width*height];
8e08b761 39
5515f252
GT
40 int len = width*height;
41 int i;
42 for ( i = 0; i != len; ++i )
43 array[i] = fill;
8e08b761 44
5515f252 45 return array;
8e08b761
JS
46}
47
48#define GET_ELEM(array,x,y) (array[width*(y)+(x)])
49
50#define MIN_COLOR_DIFF 10
51
52#define IS_IN_ARRAY(x,y) ( (x) < width && (y) < height && (x) >= 0 && (y) >= 0 )
53
54#define GET_RED(col) col & 0xFF
5515f252 55#define GET_GREEN(col) (col >> 8) & 0xFF
8e08b761
JS
56#define GET_BLUE(col) (col >> 16) & 0xFF
57
58#define MAKE_INT_COLOR(red,green,blue) ( (red) | \
59 ( ( (green) << 8 ) & 0xFF00 ) | \
5515f252 60 ( ( (blue) << 16) & 0xFF0000) \
8e08b761
JS
61 )
62
63#define IS_GREATER(col1,col2) ( ( (GET_RED(col1) ) > (GET_RED(col2) ) + MIN_COLOR_DIFF ) && \
64 ( (GET_GREEN(col1)) > (GET_GREEN(col2)) + MIN_COLOR_DIFF ) && \
5515f252
GT
65 ( (GET_BLUE(col1) ) > (GET_BLUE(col2) ) + MIN_COLOR_DIFF ) \
66 )
8e08b761 67
5515f252 68#define MASK_BG 0
8e08b761
JS
69#define MASK_DARK 1
70#define MASK_LIGHT 2
71
72// helper function, used internally
73
74static void gray_out_pixmap( int* src, int* dest, int width, int height )
75{
5515f252
GT
76 // assuming the pixels along the edges are of the background color
77
78 int x = 0;
79 int y = 1;
80
81 do
82 {
83 int cur = GET_ELEM(src,x,y);
84
85
86 if ( IS_IN_ARRAY(x-1,y-1) )
87 {
88 int upperElem = GET_ELEM(src,x-1,y-1);
89
90 // if the upper element is lighter than current
91 if ( IS_GREATER(upperElem,cur) )
92 {
93 GET_ELEM(dest,x,y) = MASK_DARK;
94 }
95 else
96 // if the current element is ligher than the upper
97 if ( IS_GREATER(cur,upperElem) )
98 {
99 GET_ELEM(dest,x,y) = MASK_LIGHT;
100 }
101 else
102 {
103 if ( GET_ELEM(dest,x-1,y-1) == MASK_LIGHT )
104
105 GET_ELEM(dest,x,y) = MASK_BG;
106
107 if ( GET_ELEM(dest,x-1,y-1 ) == MASK_DARK )
108
109 GET_ELEM(dest,x,y) = MASK_DARK;
110 else
111 GET_ELEM(dest,x,y) = MASK_BG;
112 }
113 }
114
115 // go zig-zag
116
117 if ( IS_IN_ARRAY(x+1,y-1) )
118 {
119 ++x;
120 --y;
121 }
122 else
123 {
124 while ( IS_IN_ARRAY(x-1,y+1) )
125 {
126 --x;
127 ++y;
128 }
129
130 if ( IS_IN_ARRAY(x,y+1) )
131 {
132 ++y;
133 continue;
134 }
135 else
136 {
137 if ( IS_IN_ARRAY(x+1,y) )
138 {
139 ++x;
140 continue;
141 }
142 else break;
143 }
144 }
145
146 } while (1);
8e08b761
JS
147}
148
4cbc57f0 149// algorithm for making the image look "grayed" (e.g. disabled button)
8e08b761
JS
150// NOTE:: used GetPixel(), which is Windows-Only!
151
152void gray_out_image_on_dc( wxDC& dc, int width, int height )
153{
5515f252
GT
154 // assuming the pixels along the edges are of the background color
155 wxColour bgCol;
156 dc.GetPixel( 0, 0, &bgCol );
157
e1c6c6ae
VS
158 wxPen darkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW),1, wxSOLID );
159 wxPen lightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT),1, wxSOLID );
5515f252
GT
160 wxPen bgPen ( bgCol, 1, wxSOLID );
161
162 int* src = create_array( width, height, MASK_BG );
163 int* dest = create_array( width, height, MASK_BG );
164
165 int x, y;
166 for ( y = 0; y != height; ++y )
167 {
168 for ( x = 0; x != width; ++x )
169 {
170 wxColour col;
171 dc.GetPixel( x,y, &col );
172
173 GET_ELEM(src,x,y) = MAKE_INT_COLOR( col.Red(), col.Green(), col.Blue() );
174 }
175 }
176 gray_out_pixmap( src, dest, width, height );
177
178 for ( y = 0; y != height; ++y )
179 {
180 for ( x = 0; x != width; ++x )
181 {
182 int mask = GET_ELEM(dest,x,y);
183
184 switch (mask)
185 {
186 case MASK_BG : { dc.SetPen( bgPen );
187 dc.DrawPoint( x,y ); break;
188 }
189 case MASK_DARK : { dc.SetPen( darkPen );
190 dc.DrawPoint( x,y ); break;
191 }
192 case MASK_LIGHT : { dc.SetPen( lightPen );
193 dc.DrawPoint( x,y ); break;
194 }
195 default : break;
196 }
197 }
198 }
199 delete [] src;
200 delete [] dest;
8e08b761
JS
201}
202
203///////////////////////////////
204
4cbc57f0 205/***** Implementation for class wxNewBitmapButton *****/
8e08b761
JS
206
207IMPLEMENT_DYNAMIC_CLASS(wxNewBitmapButton, wxPanel)
208
209BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel )
210
45da7759
JS
211 EVT_LEFT_DOWN ( wxNewBitmapButton::OnLButtonDown )
212 EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp )
45d6fd80
JS
213// EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick )
214 EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDown )
45da7759
JS
215 EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter )
216 EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave )
8e08b761 217
5515f252
GT
218 EVT_SIZE ( wxNewBitmapButton::OnSize )
219 EVT_PAINT( wxNewBitmapButton::OnPaint )
8e08b761 220
5515f252 221 //EVT_KILL_FOCUS( wxNewBitmapButton::OnKillFocus )
8e08b761 222
5515f252 223 EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground )
8e08b761 224
ab839dff
JS
225 EVT_IDLE(wxNewBitmapButton::OnIdle)
226
8e08b761
JS
227END_EVENT_TABLE()
228
ab839dff 229wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap,
5515f252
GT
230 const wxString& labelText,
231 int alignText,
232 bool isFlat,
ab839dff 233 int firedEventType,
5515f252
GT
234 int marginX,
235 int marginY,
236 int textToLabelGap,
237 bool isSticky)
238 : mTextToLabelGap ( textToLabelGap ),
239 mMarginX( marginX ),
240 mMarginY( marginY ),
241 mTextAlignment( alignText ),
242 mIsSticky( isSticky ),
243 mIsFlat( isFlat ),
244 mLabelText( labelText ),
245 mImageFileType( wxBITMAP_TYPE_INVALID ),
246 mDepressedBmp( labelBitmap ),
247
248 mpDepressedImg( NULL ),
249 mpPressedImg ( NULL ),
250 mpDisabledImg ( NULL ),
251 mpFocusedImg ( NULL ),
252
253
c82c42d4
WS
254 mDragStarted ( false ),
255 mIsPressed ( false ),
256 mIsInFocus ( false ),
257 mIsToggled ( false ),
258 mHasFocusedBmp( false ),
5515f252
GT
259 mFiredEventType( firedEventType ),
260
261 mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ),
e1c6c6ae
VS
262 mDarkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ),
263 mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),
264 mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ),
5515f252 265
c82c42d4
WS
266 mIsCreated( false ),
267 mSizeIsSet( false )
8e08b761
JS
268
269{
270}
271
272wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName,
52b5ab7e
GD
273 const wxBitmapType bitmapFileType,
274 const wxString& labelText,
275 int alignText,
276 bool isFlat,
196be0f1
JS
277 int WXUNUSED(firedEventType),
278 int WXUNUSED(marginX),
279 int WXUNUSED(marginY),
280 int WXUNUSED(textToLabelGap),
281 bool WXUNUSED(isSticky))
8e08b761 282
5515f252
GT
283 : mTextToLabelGap ( 2 ),
284 mMarginX( 2 ),
285 mMarginY( 2 ),
286 mTextAlignment( alignText ),
c82c42d4 287 mIsSticky( false ),
5515f252
GT
288 mIsFlat( isFlat ),
289 mLabelText( labelText ),
290 mImageFileName( bitmapFileName ),
291 mImageFileType( bitmapFileType ),
292
293 mpDepressedImg( NULL ),
294 mpPressedImg ( NULL ),
295 mpDisabledImg ( NULL ),
296 mpFocusedImg ( NULL ),
297
c82c42d4
WS
298 mDragStarted ( false ),
299 mIsPressed ( false ),
300 mIsInFocus ( false ),
301 mIsToggled ( false ),
302 mHasFocusedBmp( false ),
5515f252
GT
303 mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ),
304
305 mBlackPen( wxColour( 0, 0, 0), 1, wxSOLID ),
e1c6c6ae
VS
306 mDarkPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID ),
307 mGrayPen ( wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), 1, wxSOLID ),
308 mLightPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT), 1, wxSOLID ),
5515f252 309
c82c42d4
WS
310 mIsCreated( false ),
311 mSizeIsSet( false )
8e08b761
JS
312
313{
314}
315
316wxNewBitmapButton::~wxNewBitmapButton(void)
317{
5515f252 318 DestroyLabels();
8e08b761
JS
319}
320
321void wxNewBitmapButton::DrawShade( int outerLevel,
5515f252
GT
322 wxDC& dc,
323 wxPen& upperLeftSidePen,
324 wxPen& lowerRightSidePen )
8e08b761 325{
5515f252 326 wxBitmap* pBmp = GetStateLabel();
8e08b761 327
ab839dff
JS
328 int x = mMarginX - (outerLevel + 2);
329 int y = mMarginY - (outerLevel + 2);
8e08b761 330
ab839dff
JS
331 int height = pBmp->GetHeight() + (outerLevel + 2)*2 - 1;
332 int width = pBmp->GetWidth() + (outerLevel + 2)*2 - 1;
8e08b761 333
5515f252
GT
334 dc.SetPen( upperLeftSidePen );
335 dc.DrawLine( x,y, x + width, y );
336 dc.DrawLine( x,y, x, y + height );
8e08b761 337
5515f252
GT
338 dc.SetPen( lowerRightSidePen );
339 dc.DrawLine( x + width, y, x + width, y + height + 1 );
340 dc.DrawLine( x, y + height, x + width, y + height );
8e08b761
JS
341}
342
343void wxNewBitmapButton::DestroyLabels()
344{
5515f252
GT
345 if ( mpDepressedImg ) delete mpDepressedImg;
346 if ( mpPressedImg ) delete mpPressedImg;
347 if ( mpDisabledImg ) delete mpDisabledImg;
348 if ( mpFocusedImg ) delete mpFocusedImg;
349
350 mpDepressedImg = NULL;
351 mpPressedImg = NULL;
352 mpDisabledImg = NULL;
353 mpFocusedImg = NULL;
8e08b761
JS
354}
355
356wxBitmap* wxNewBitmapButton::GetStateLabel()
357{
5515f252
GT
358 if ( IsEnabled() )
359 {
360 if ( mIsPressed )
361 {
362 return mpPressedImg;
363 }
364 else
365 {
366 if ( mIsInFocus )
367 {
368 if ( mHasFocusedBmp )
369
370 return mpFocusedImg;
371 else
372 return mpDepressedImg;
373 }
374 else
375 return mpDepressedImg;
376 }
377 }
378 else
379 return mpDisabledImg;
8e08b761
JS
380}
381
382static const unsigned char _gDisableImage[] = { 0x55,0xAA,0x55,0xAA,
5515f252
GT
383 0x55,0xAA,0x55,0xAA,
384 0x55,0xAA,0x55,0xAA,
385 0x55,0xAA,0x55,0xAA
386 };
8e08b761 387void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
5515f252 388 bool isEnabled, bool isPressed )
8e08b761 389{
5515f252
GT
390 if ( destBmp != 0 ) return;
391
4cbc57f0 392 // render labels on-demand
5515f252
GT
393
394 wxMemoryDC srcDc;
395 srcDc.SelectObject( *srcBmp );
396
397 bool hasText = ( mTextAlignment != NB_NO_TEXT ) &&
398 ( mLabelText.length() != 0 );
399
400 bool hasImage = (mTextAlignment != NB_NO_IMAGE);
401
402 wxSize destDim;
403 wxPoint txtPos;
404 wxPoint imgPos;
405
406 if ( hasText )
407 {
408 long txtWidth, txtHeight;
409
e1c6c6ae 410 srcDc.SetFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) );
5515f252
GT
411 srcDc.GetTextExtent( mLabelText, &txtWidth, &txtHeight );
412
413 if ( mTextAlignment == NB_ALIGN_TEXT_RIGHT )
414 {
415 destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth;
416
ab839dff 417 destDim.y =
5515f252
GT
418 wxMax( srcBmp->GetHeight(), txtHeight );
419
420 txtPos.x = srcBmp->GetWidth() + mTextToLabelGap;
421 txtPos.y = (destDim.y - txtHeight)/2;
422 imgPos.x = 0;
423 imgPos.y = (destDim.y - srcBmp->GetHeight())/2;
424 }
425 else
426 if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM )
427 {
ab839dff 428 destDim.x =
5515f252
GT
429 wxMax( srcBmp->GetWidth(), txtWidth );
430
431 destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight;
432
433 txtPos.x = (destDim.x - txtWidth)/2;
434 txtPos.y = srcBmp->GetHeight() + mTextToLabelGap;
435 imgPos.x = (destDim.x - srcBmp->GetWidth())/2;
436 imgPos.y = 0;
437 }
ab839dff 438 else
5515f252 439 {
873a543b 440 wxFAIL_MSG(wxT("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()"));
5515f252
GT
441 }
442 }
443 else
444 {
445 imgPos.x = 0;
446 imgPos.y = 0;
447 destDim.x = srcBmp->GetWidth();
448 destDim.y = srcBmp->GetHeight();
449 }
450
451 destBmp = new wxBitmap( int(destDim.x), int(destDim.y) );
452
453 wxMemoryDC destDc;
454 destDc.SelectObject( *destBmp );
455
e1c6c6ae 456 wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID );
5515f252
GT
457 wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT );
458
5515f252
GT
459 destDc.SetBrush( grayBrush );
460 destDc.SetPen( nullPen );
8e08b761 461
5515f252 462 destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 );
8e08b761 463
5515f252
GT
464 if ( isPressed )
465 {
466 ++imgPos.x; ++imgPos.y;
467 ++txtPos.x; ++txtPos.y;
468 }
8e08b761 469
5515f252
GT
470 if ( hasImage )
471 {
8e08b761 472
ab839dff 473 destDc.Blit( imgPos.x, imgPos.y,
5515f252
GT
474 srcBmp->GetWidth()+1,
475 srcBmp->GetHeight()+1,
c82c42d4 476 &srcDc, 0,0, wxCOPY,true );
5515f252 477 }
8e08b761 478
5515f252
GT
479 if ( hasText )
480 {
481 wxWindow* pTopWnd = this;
8e08b761 482
5515f252
GT
483 do
484 {
485 wxWindow* pParent = pTopWnd->GetParent();
8e08b761 486
5515f252 487 if ( pParent == 0 )
8e08b761
JS
488 break;
489
5515f252
GT
490 pTopWnd = pParent;
491 } while (1);
8e08b761 492
e1c6c6ae 493 destDc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT) );
8e08b761 494
5515f252 495 if ( isEnabled )
8e08b761 496 {
e1c6c6ae 497 destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT) );
5515f252 498 }
8e08b761
JS
499 else
500 {
e1c6c6ae 501 destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) );
5515f252 502 }
e1c6c6ae 503 destDc.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) );
8e08b761 504
5515f252
GT
505 destDc.DrawText( mLabelText, txtPos.x, txtPos.y );
506 }
8e08b761 507
5515f252 508 if ( !isEnabled ){
ab839dff 509
8e08b761 510#ifdef __WXMSW__ // This is currently MSW specific
5515f252 511 gray_out_image_on_dc( destDc, destDim.x, destDim.y );
8e08b761 512#else
5515f252 513 wxBrush checkerBrush( wxBitmap( (const char*)_gDisableImage,8,8) );
e1c6c6ae 514 checkerBrush.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
5515f252
GT
515 destDc.SetBrush( checkerBrush );
516 destDc.DrawRectangle( imgPos.x, imgPos.y, srcBmp->GetWidth()+1, srcBmp->GetHeight()+1);
8e08b761 517#endif
5515f252
GT
518 }
519 // adjust button size to fit the new dimensions of the label
520 if ( !mSizeIsSet && 0 )
521 {
c82c42d4
WS
522 mSizeIsSet = true;
523 SetSize( wxDefaultPosition.x,wxDefaultPosition.y,
5515f252 524 destBmp->GetWidth() + mMarginX*2,
ab839dff 525 destBmp->GetHeight() + mMarginY*2, 0
5515f252
GT
526 );
527 }
65e50848 528 destDc.SelectObject( wxNullBitmap );
ab839dff 529
45747ae3 530#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
65e50848 531 // Map to system colours
2b5f62a0 532 (void) wxToolBar::MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight());
ab839dff 533#endif
8e08b761 534}
65e50848 535
8e08b761
JS
536void wxNewBitmapButton::RenderAllLabelImages()
537{
5515f252 538 if ( !mIsCreated )
8e08b761 539 return;
c82c42d4
WS
540 RenderLabelImage( mpDisabledImg, &mDepressedBmp, false );
541 RenderLabelImage( mpPressedImg, &mDepressedBmp, true, true );
542 RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false );
5515f252 543 if ( mHasFocusedBmp )
8e08b761 544 {
c82c42d4 545 RenderLabelImage( mpFocusedImg, &mFocusedBmp, true, false );
5515f252 546 }
8e08b761 547}
ab839dff 548
8e08b761
JS
549
550void wxNewBitmapButton::RenderLabelImages()
551{
5515f252 552 if ( !mIsCreated )
8e08b761
JS
553 return;
554
5515f252
GT
555 if ( !IsEnabled() )
556 {
c82c42d4 557 RenderLabelImage( mpDisabledImg, &mDepressedBmp, false );
5515f252
GT
558 }
559 else
560
ab839dff 561 if ( mIsPressed )
5515f252 562
c82c42d4 563 RenderLabelImage( mpPressedImg, &mDepressedBmp, true, true );
5515f252
GT
564 else
565 {
566 if ( mIsInFocus )
567 {
568 if ( mHasFocusedBmp )
c82c42d4 569 RenderLabelImage( mpFocusedImg, &mFocusedBmp, true, false );
5515f252 570 else
c82c42d4 571 RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false );
5515f252
GT
572 }
573 else
c82c42d4 574 RenderLabelImage( mpDepressedImg, &mDepressedBmp, true, false );
5515f252 575 }
8e08b761
JS
576}
577
ab839dff
JS
578bool wxNewBitmapButton::Toggle(bool enable)
579{
580 if ( mIsToggled == enable )
581 {
c82c42d4 582 return false;
ab839dff
JS
583 }
584
585 mIsToggled = enable;
586 Refresh();
587
c82c42d4 588 return true;
ab839dff
JS
589}
590
45da7759
JS
591bool wxNewBitmapButton::Enable(bool enable)
592{
593 if ( enable != m_isEnabled )
594 {
595 if ( mIsInFocus )
596 {
c82c42d4 597 mIsInFocus = false;
45da7759
JS
598 }
599
600 if ( mIsPressed )
601 {
c82c42d4 602 mIsPressed = false;
45da7759
JS
603 }
604
605 Refresh();
606 }
607
608 return wxPanel::Enable( enable );
609}
610
8e08b761
JS
611void wxNewBitmapButton::DrawDecorations( wxDC& dc )
612{
5515f252
GT
613 if ( mIsFlat )
614 {
615 DrawShade( 1, dc, mGrayPen, mGrayPen );
ab839dff
JS
616 if ( mIsToggled )
617 {
618 DrawShade( 0, dc, mDarkPen, mLightPen );
619 }
620 else if ( mIsInFocus )
5515f252
GT
621 {
622 if ( mIsPressed )
623 DrawShade( 0, dc, mDarkPen, mLightPen );
624 else
625 DrawShade( 0, dc, mLightPen, mDarkPen );
626 }
627 else
628 DrawShade( 0, dc, mGrayPen, mGrayPen );
629 }
630 else
631 {
ab839dff 632 if ( mIsPressed || mIsToggled )
5515f252
GT
633 {
634 DrawShade( 0, dc, mDarkPen, mGrayPen );
635 DrawShade( 1, dc, mBlackPen, mLightPen );
636 }
637 else
638 {
639 DrawShade( 0, dc, mGrayPen, mDarkPen );
640 DrawShade( 1, dc, mLightPen, mBlackPen );
641 }
642 }
8e08b761
JS
643}
644
ab839dff 645void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap,
5515f252 646 const wxString& labelText )
8e08b761 647{
5515f252 648 DestroyLabels();
8e08b761 649
5515f252
GT
650 mLabelText = labelText;
651 mDepressedBmp = labelBitmap;
8e08b761 652
5515f252
GT
653 //RenderLabelImages();
654 RenderAllLabelImages();
8e08b761
JS
655}
656
657void wxNewBitmapButton::SetAlignments( int alignText,
5515f252
GT
658 int marginX,
659 int marginY,
660 int textToLabelGap)
8e08b761 661{
5515f252 662 DestroyLabels();
8e08b761 663
5515f252
GT
664 mMarginX = marginX;
665 mMarginY = marginY;
666 mTextAlignment = alignText;
667 mTextToLabelGap = textToLabelGap;
8e08b761 668
5515f252
GT
669 //RenderLabelImages();
670 RenderAllLabelImages();
8e08b761
JS
671}
672
673// event handlers
674
196be0f1 675void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& WXUNUSED(event) )
8e08b761 676{
c82c42d4
WS
677 mDragStarted = true;
678 mIsPressed = true;
5515f252 679 Refresh();
8e08b761
JS
680}
681
682void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
683{
5515f252 684 if ( !mDragStarted )
8e08b761
JS
685 return;
686
c82c42d4
WS
687 mDragStarted = false;
688 mIsPressed = false;
5515f252 689 Refresh();
8e08b761 690
45da7759
JS
691 if ( IsInWindow( event.m_x, event.m_y ) )
692 {
693 // fire event, if mouse was released
694 // within the bounds of button
695 wxCommandEvent cmd( mFiredEventType, GetId() );
696 GetParent()->ProcessEvent( cmd );
697 }
698}
8e08b761 699
8e08b761
JS
700bool wxNewBitmapButton::IsInWindow( int x, int y )
701{
5515f252
GT
702 int width, height;
703 GetSize( &width, &height );
8e08b761 704
5515f252
GT
705 return ( x >= 0 && y >= 0 &&
706 x < width &&
707 y < height );
8e08b761
JS
708}
709
196be0f1 710void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& WXUNUSED(event) )
8e08b761 711{
45da7759 712 bool prevIsInFocus = mIsInFocus;
5515f252 713
45da7759
JS
714 if ( !mIsInFocus )
715 {
c82c42d4 716 mIsInFocus = true;
5515f252 717 }
45da7759 718 if ( prevIsInFocus != mIsInFocus )
5515f252 719 {
45da7759 720 Refresh();
5515f252 721 }
45da7759 722}
5515f252 723
196be0f1 724void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& WXUNUSED(event) )
45da7759
JS
725{
726 bool prevIsInFocus = mIsInFocus;
727 bool prevIsPressed = mIsPressed;
728 if ( mIsInFocus )
5515f252 729 {
c82c42d4
WS
730 mIsInFocus = false;
731 mIsPressed = false;
5515f252 732 }
45da7759 733 if ( prevIsInFocus != mIsInFocus || prevIsPressed != mIsPressed )
8e08b761 734 {
5515f252
GT
735 Refresh();
736 }
8e08b761
JS
737}
738
196be0f1 739void wxNewBitmapButton::OnSize( wxSizeEvent& WXUNUSED(event) )
8e08b761 740{
5515f252 741 //Reshape();
8e08b761
JS
742}
743
744void wxNewBitmapButton::Reshape( )
4cbc57f0 745{
5515f252 746 bool wasCreated = mIsCreated;
c82c42d4 747 mIsCreated = true;
8e08b761 748
5515f252
GT
749 if ( !wasCreated )
750 {
751 // in the case of loading button from stream, check if we
752 // have non-empty image-file name, load if possible
8e08b761 753
873a543b 754 if ( mImageFileName != wxT("") )
5515f252
GT
755 {
756 mDepressedBmp.LoadFile( mImageFileName, mImageFileType );
8e08b761 757
5515f252
GT
758 //wxMessageBox("Image Loaded!!!");
759 }
8e08b761 760
5515f252
GT
761 //RenderLabelImages();
762 RenderAllLabelImages();
8e08b761 763
5515f252 764 wxBitmap* pCurImg = GetStateLabel();
8e08b761 765
5515f252
GT
766 int w = pCurImg->GetWidth(),
767 h = pCurImg->GetHeight();
8e08b761 768
5515f252
GT
769 SetSize( 0,0, w + mMarginX*2, h + mMarginY*2 , 0 );
770 }
8e08b761
JS
771}
772
773void wxNewBitmapButton::DrawLabel( wxDC& dc )
774{
5515f252 775 wxBitmap* pCurBmp = GetStateLabel();
8e08b761 776
5515f252
GT
777 if ( pCurBmp == NULL )
778 {
779 wxSizeEvent evt;
780 OnSize( evt ); // fake it up!
8e08b761 781
5515f252
GT
782 //RenderLabelImages();
783 pCurBmp = GetStateLabel();
784 }
8e08b761 785
5515f252
GT
786 wxMemoryDC mdc;
787 mdc.SelectObject( *pCurBmp );
8e08b761 788
5515f252
GT
789 dc.Blit( mMarginX, mMarginY,
790 pCurBmp->GetWidth(),
791 pCurBmp->GetHeight(),
792 &mdc, 0,0, wxCOPY
793 );
8e08b761 794
5515f252 795 mdc.SelectObject( wxNullBitmap );
8e08b761
JS
796}
797
196be0f1 798void wxNewBitmapButton::OnPaint( wxPaintEvent& WXUNUSED(event) )
8e08b761 799{
5515f252 800 wxPaintDC dc(this);
8e08b761 801
5515f252
GT
802 // first, make sure images for current state are prepared
803 //RenderLabelImages();
8e08b761 804
5515f252 805 DrawLabel( dc );
8e08b761 806
5515f252 807 DrawDecorations( dc );
8e08b761
JS
808}
809
196be0f1 810void wxNewBitmapButton::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
8e08b761 811{
5515f252 812 // do nothing
8e08b761
JS
813}
814
196be0f1 815void wxNewBitmapButton::OnKillFocus( wxFocusEvent& WXUNUSED(event) )
8e08b761 816{
5515f252 817 // useless
8e08b761 818
873a543b 819 wxMessageBox(wxT("kill-focus for button!"));
8e08b761
JS
820}
821
ab839dff
JS
822// ----------------------------------------------------------------------------
823// UI updates
824// ----------------------------------------------------------------------------
825
826void wxNewBitmapButton::OnIdle(wxIdleEvent& event)
827{
828 DoButtonUpdate();
829
830 event.Skip();
831}
832
833// Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
834void wxNewBitmapButton::DoButtonUpdate()
835{
836 wxUpdateUIEvent event(GetId());
837 event.SetEventObject(this);
838
839 if ( GetParent()->ProcessEvent(event) )
840 {
841 if ( event.GetSetEnabled() )
842 {
843 bool enabled = event.GetEnabled();
844 if ( enabled != IsEnabled() )
845 Enable( enabled );
846 }
847 if ( event.GetSetChecked() )
848 Toggle( event.GetChecked() );
849 }
850}