]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/univ/bmpbuttn.cpp
Fix discrepancy between different ways of measuring text extents under Mac.
[wxWidgets.git] / src / univ / bmpbuttn.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/univ/bmpbuttn.cpp
3// Purpose: wxBitmapButton implementation
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 25.08.00
7// RCS-ID: $Id$
8// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20#include "wx/wxprec.h"
21
22#ifdef __BORLANDC__
23 #pragma hdrstop
24#endif
25
26#if wxUSE_BMPBUTTON
27
28#include "wx/bmpbuttn.h"
29
30#ifndef WX_PRECOMP
31 #include "wx/dc.h"
32 #include "wx/validate.h"
33#endif
34
35#include "wx/univ/renderer.h"
36
37// ============================================================================
38// implementation
39// ============================================================================
40
41IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
42
43BEGIN_EVENT_TABLE(wxBitmapButton, wxButton)
44 EVT_SET_FOCUS(wxBitmapButton::OnSetFocus)
45 EVT_KILL_FOCUS(wxBitmapButton::OnKillFocus)
46END_EVENT_TABLE()
47
48// ----------------------------------------------------------------------------
49// wxBitmapButton
50// ----------------------------------------------------------------------------
51
52bool wxBitmapButton::Create(wxWindow *parent,
53 wxWindowID id,
54 const wxBitmap& bitmap,
55 const wxPoint &pos,
56 const wxSize &size,
57 long style,
58 const wxValidator& validator,
59 const wxString &name)
60{
61 // we add wxBU_EXACTFIT because the bitmap buttons are not the standard
62 // ones and so shouldn't be forced to be of the standard size which is
63 // typically too big for them
64 if ( !wxButton::Create(parent, id, bitmap, wxEmptyString,
65 pos, size, style | wxBU_EXACTFIT, validator, name) )
66 return false;
67
68 m_bitmaps[State_Normal] = bitmap;
69
70 return true;
71}
72
73void wxBitmapButton::OnSetBitmap()
74{
75 wxBitmap bmp;
76 if ( !IsEnabled() )
77 {
78 bmp = GetBitmapDisabled();
79 }
80 else if ( IsPressed() )
81 {
82 bmp = GetBitmapPressed();
83 }
84 else if ( IsFocused() )
85 {
86 bmp = GetBitmapFocus();
87 }
88 //else: just leave it invalid, this means "normal" anyhow in ChangeBitmap()
89
90 ChangeBitmap(bmp);
91}
92
93bool wxBitmapButton::ChangeBitmap(const wxBitmap& bmp)
94{
95 wxBitmap bitmap = bmp.IsOk() ? bmp : GetBitmapLabel();
96 if ( bitmap.IsSameAs(m_bitmap) )
97 return false;
98
99 m_bitmap = bitmap;
100
101 return true;
102}
103
104bool wxBitmapButton::Enable(bool enable)
105{
106 if ( !wxButton::Enable(enable) )
107 return false;
108
109 if ( !enable && ChangeBitmap(GetBitmapDisabled()) )
110 Refresh();
111
112 return true;
113}
114
115bool wxBitmapButton::SetCurrent(bool doit)
116{
117 ChangeBitmap(doit ? GetBitmapFocus() : GetBitmapLabel());
118
119 return wxButton::SetCurrent(doit);
120}
121
122void wxBitmapButton::OnSetFocus(wxFocusEvent& event)
123{
124 if ( ChangeBitmap(GetBitmapFocus()) )
125 Refresh();
126
127 event.Skip();
128}
129
130void wxBitmapButton::OnKillFocus(wxFocusEvent& event)
131{
132 if ( ChangeBitmap(GetBitmapLabel()) )
133 Refresh();
134
135 event.Skip();
136}
137
138void wxBitmapButton::Press()
139{
140 ChangeBitmap(GetBitmapPressed());
141
142 wxButton::Press();
143}
144
145void wxBitmapButton::Release()
146{
147 ChangeBitmap(IsFocused() ? GetBitmapFocus() : GetBitmapLabel());
148
149 wxButton::Release();
150}
151
152#endif // wxUSE_BMPBUTTON