1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxBitmapButton
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "bmpbuttn.h"
17 #define XtScreen XTSCREEN
22 #include "wx/bmpbuttn.h"
25 #pragma message disable nosimpint
27 #include <Xm/PushBG.h>
30 #pragma message enable nosimpint
33 #include "wx/motif/private.h"
35 // Implemented in button.cpp
36 void wxButtonCallback (Widget w
, XtPointer clientData
, XtPointer ptr
);
38 Pixmap
XCreateInsensitivePixmap( Display
*display
, Pixmap pixmap
);
40 IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton
, wxButton
)
42 wxBitmapButton::wxBitmapButton()
44 m_marginX
= wxDEFAULT_BUTTON_MARGIN
; m_marginY
= wxDEFAULT_BUTTON_MARGIN
;
45 m_insensPixmap
= (WXPixmap
) 0;
48 bool wxBitmapButton::Create(wxWindow
*parent
, wxWindowID id
, const wxBitmap
& bitmap
,
50 const wxSize
& size
, long style
,
51 const wxValidator
& validator
,
54 m_buttonBitmap
= bitmap
;
55 m_buttonBitmapOriginal
= bitmap
;
56 m_buttonBitmapSelected
= bitmap
;
57 m_buttonBitmapSelectedOriginal
= bitmap
;
60 SetValidator(validator
);
61 parent
->AddChild(this);
63 m_backgroundColour
= parent
->GetBackgroundColour() ;
64 m_foregroundColour
= parent
->GetForegroundColour() ;
65 m_windowStyle
= style
;
77 m_windowId
= NewControlId();
81 Widget parentWidget
= (Widget
) parent
->GetClientWidget();
84 * Patch Note (important)
85 * There is no major reason to put a defaultButtonThickness here.
86 * Not requesting it give the ability to put wxButton with a spacing
87 * as small as requested. However, if some button become a DefaultButton,
88 * other buttons are no more aligned -- This is why we set
89 * defaultButtonThickness of ALL buttons belonging to the same wxPanel,
90 * in the ::SetDefaultButton method.
92 Widget buttonWidget
= XtVaCreateManagedWidget ("button",
94 // Gadget causes problems for default button operation.
96 xmPushButtonGadgetClass
, parentWidget
,
98 xmPushButtonWidgetClass
, parentWidget
,
100 // XmNdefaultButtonShadowThickness, 1, // See comment for wxButton::SetDefault
103 m_mainWidget
= (WXWidget
) buttonWidget
;
105 m_font
= parent
->GetFont();
108 ChangeBackgroundColour ();
112 XtAddCallback (buttonWidget
, XmNactivateCallback
, (XtCallbackProc
) wxButtonCallback
,
115 SetCanAddEventHandler(TRUE
);
117 wxSize newSize
= size
;
119 if (m_buttonBitmap
.Ok())
121 int border
= (style
& wxNO_BORDER
) ? 4 : 10;
123 newSize
.x
= m_buttonBitmap
.GetWidth()+border
;
125 newSize
.y
= m_buttonBitmap
.GetHeight()+border
;
128 AttachWidget (parent
, m_mainWidget
, (WXWidget
) NULL
, pos
.x
, pos
.y
, newSize
.x
, newSize
.y
);
133 wxBitmapButton::~wxBitmapButton()
135 SetBitmapLabel(wxNullBitmap
);
138 XmDestroyPixmap (DefaultScreenOfDisplay ((Display
*) GetXDisplay()), (Pixmap
) m_insensPixmap
);
141 void wxBitmapButton::SetBitmapLabel(const wxBitmap
& bitmap
)
143 m_buttonBitmapOriginal
= bitmap
;
144 m_buttonBitmap
= bitmap
;
149 void wxBitmapButton::SetBitmapSelected(const wxBitmap
& sel
)
151 m_buttonBitmapSelected
= sel
;
152 m_buttonBitmapSelectedOriginal
= sel
;
157 void wxBitmapButton::SetBitmapFocus(const wxBitmap
& focus
)
159 m_buttonBitmapFocus
= focus
;
163 void wxBitmapButton::SetBitmapDisabled(const wxBitmap
& disabled
)
165 m_buttonBitmapDisabled
= disabled
;
166 m_buttonBitmapDisabledOriginal
= disabled
;
171 void wxBitmapButton::DoSetBitmap()
173 if (m_buttonBitmapOriginal
.Ok())
176 Pixmap insensPixmap
= 0;
177 Pixmap armPixmap
= 0;
179 // Must re-make the bitmap to have its transparent areas drawn
180 // in the current widget background colour.
181 if (m_buttonBitmapOriginal
.GetMask())
184 XtVaGetValues((Widget
) m_mainWidget
, XmNbackground
, &backgroundPixel
,
188 col
.SetPixel(backgroundPixel
);
190 wxBitmap newBitmap
= wxCreateMaskedBitmap(m_buttonBitmapOriginal
, col
);
191 m_buttonBitmap
= newBitmap
;
193 pixmap
= (Pixmap
) m_buttonBitmap
.GetPixmap();
196 pixmap
= (Pixmap
) m_buttonBitmap
.GetLabelPixmap(m_mainWidget
);
198 if (m_buttonBitmapDisabledOriginal
.Ok())
200 if (m_buttonBitmapDisabledOriginal
.GetMask())
203 XtVaGetValues((Widget
) m_mainWidget
, XmNbackground
, &backgroundPixel
,
207 col
.SetPixel(backgroundPixel
);
209 wxBitmap newBitmap
= wxCreateMaskedBitmap(m_buttonBitmapDisabledOriginal
, col
);
210 m_buttonBitmapDisabled
= newBitmap
;
212 insensPixmap
= (Pixmap
) m_buttonBitmapDisabled
.GetPixmap();
215 insensPixmap
= (Pixmap
) m_buttonBitmap
.GetInsensPixmap(m_mainWidget
);
218 insensPixmap
= (Pixmap
) m_buttonBitmap
.GetInsensPixmap(m_mainWidget
);
220 // Now make the bitmap representing the armed state
221 if (m_buttonBitmapSelectedOriginal
.Ok())
223 if (m_buttonBitmapSelectedOriginal
.GetMask())
226 XtVaGetValues((Widget
) m_mainWidget
, XmNarmColor
, &backgroundPixel
,
230 col
.SetPixel(backgroundPixel
);
232 wxBitmap newBitmap
= wxCreateMaskedBitmap(m_buttonBitmapSelectedOriginal
, col
);
233 m_buttonBitmapSelected
= newBitmap
;
235 armPixmap
= (Pixmap
) m_buttonBitmapSelected
.GetPixmap();
238 armPixmap
= (Pixmap
) m_buttonBitmap
.GetArmPixmap(m_mainWidget
);
241 armPixmap
= (Pixmap
) m_buttonBitmap
.GetArmPixmap(m_mainWidget
);
243 if (insensPixmap
== pixmap
) // <- the Get...Pixmap()-functions return the same pixmap!
246 XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget
) m_mainWidget
)), pixmap
);
247 m_insensPixmap
= (WXPixmap
) insensPixmap
;
250 XtVaSetValues ((Widget
) m_mainWidget
,
251 XmNlabelPixmap
, pixmap
,
252 XmNlabelInsensitivePixmap
, insensPixmap
,
253 XmNarmPixmap
, armPixmap
,
254 XmNlabelType
, XmPIXMAP
,
259 // Null bitmap: must not use current pixmap
260 // since it is no longer valid.
261 XtVaSetValues ((Widget
) m_mainWidget
,
262 XmNlabelType
, XmSTRING
,
263 XmNlabelPixmap
, XmUNSPECIFIED_PIXMAP
,
264 XmNlabelInsensitivePixmap
, XmUNSPECIFIED_PIXMAP
,
265 XmNarmPixmap
, XmUNSPECIFIED_PIXMAP
,
270 void wxBitmapButton::ChangeBackgroundColour()
272 DoChangeBackgroundColour(m_mainWidget
, m_backgroundColour
, TRUE
);
274 // Must reset the bitmaps since the colours have changed.
278 wxSize
wxBitmapButton::DoGetBestSize() const
282 if (m_buttonBitmap
.Ok())
284 int border
= (GetWindowStyle() & wxNO_BORDER
) ? 4 : 10;
285 ret
.x
= m_buttonBitmap
.GetWidth()+border
;
286 ret
.y
= m_buttonBitmap
.GetHeight()+border
;
289 if (!HasFlag(wxBU_EXACTFIT
))
291 if (ret
.x
< 80) ret
.x
= 80;