X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d57be459406c2830f6abc9d99ae99166c6d133b..404b319a85dadd7decf7a5a5331020520031a41c:/src/motif/bmpbuttn.cpp diff --git a/src/motif/bmpbuttn.cpp b/src/motif/bmpbuttn.cpp index 74a9f6f93e..1246d1de9d 100644 --- a/src/motif/bmpbuttn.cpp +++ b/src/motif/bmpbuttn.cpp @@ -1,125 +1,98 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: bmpbuttn.cpp +// Name: src/motif/bmpbuttn.cpp // Purpose: wxBitmapButton // Author: Julian Smart // Modified by: // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "bmpbuttn.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/bmpbuttn.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" // Implemented in button.cpp void wxButtonCallback (Widget w, XtPointer clientData, XtPointer ptr); -Pixmap XCreateInsensitivePixmap( Display *display, Pixmap pixmap ); - -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) -#endif +// Pixmap XCreateInsensitivePixmap( Display *display, Pixmap pixmap ); wxBitmapButton::wxBitmapButton() { - m_marginX = wxDEFAULT_BUTTON_MARGIN; m_marginY = wxDEFAULT_BUTTON_MARGIN; + m_marginX = m_marginY = wxDEFAULT_BUTTON_MARGIN; m_insensPixmap = (WXPixmap) 0; } -bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, - const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, - const wxString& name) +bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, + const wxString& name) { - m_buttonBitmap = bitmap; - SetName(name); - SetValidator(validator); - parent->AddChild(this); - - m_backgroundColour = parent->GetBackgroundColour() ; - m_foregroundColour = parent->GetForegroundColour() ; - m_windowStyle = style; - m_marginX = 0; - m_marginY = 0; - - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; - - if (id == -1) - m_windowId = NewControlId(); - else - m_windowId = id; + if( !CreateControl( parent, id, pos, size, style, validator, name ) ) + return false; + PreCreation(); + + m_bitmaps[State_Normal] = + m_bitmapsOriginal[State_Normal] = bitmap; + m_bitmaps[State_Pressed] = + m_bitmapsOriginal[State_Pressed] = bitmap; Widget parentWidget = (Widget) parent->GetClientWidget(); - /* - * Patch Note (important) - * There is no major reason to put a defaultButtonThickness here. - * Not requesting it give the ability to put wxButton with a spacing - * as small as requested. However, if some button become a DefaultButton, - * other buttons are no more aligned -- This is why we set - * defaultButtonThickness of ALL buttons belonging to the same wxPanel, - * in the ::SetDefaultButton method. - */ + /* + * Patch Note (important) + * There is no major reason to put a defaultButtonThickness here. + * Not requesting it give the ability to put wxButton with a spacing + * as small as requested. However, if some button become a DefaultButton, + * other buttons are no more aligned -- This is why we set + * defaultButtonThickness of ALL buttons belonging to the same wxPanel, + * in the ::SetDefaultButton method. + */ Widget buttonWidget = XtVaCreateManagedWidget ("button", - // Gadget causes problems for default button operation. + // Gadget causes problems for default button operation. #if wxUSE_GADGETS - xmPushButtonGadgetClass, parentWidget, + xmPushButtonGadgetClass, parentWidget, #else - xmPushButtonWidgetClass, parentWidget, + xmPushButtonWidgetClass, parentWidget, #endif -// XmNdefaultButtonShadowThickness, 1, // See comment for wxButton::SetDefault - NULL); + // See comment for wxButton::SetDefault + // XmNdefaultButtonShadowThickness, 1, + XmNrecomputeSize, False, + NULL); m_mainWidget = (WXWidget) buttonWidget; - if (bitmap.Ok()) - { - Pixmap p1, p2; + XtAddCallback (buttonWidget, + XmNactivateCallback, (XtCallbackProc) wxButtonCallback, + (XtPointer) this); - p1 = (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap(m_mainWidget); - p2 = (Pixmap) ((wxBitmap&)bitmap).GetInsensPixmap(m_mainWidget); + wxSize best = GetBitmapLabel().IsOk() ? GetBestSize() : wxSize(30, 30); + if( size.x != -1 ) best.x = size.x; + if( size.y != -1 ) best.y = size.y; - if(p1 == p2) // <- the Get...Pixmap()-functions return the same pixmap! - { - p2 = - XCreateInsensitivePixmap(DisplayOfScreen(XtScreen(buttonWidget)), p1); - m_insensPixmap = (WXPixmap) p2; - } + PostCreation(); + OnSetBitmap(); - XtVaSetValues (buttonWidget, - XmNlabelPixmap, p1, - XmNlabelInsensitivePixmap, p2, - XmNarmPixmap, (Pixmap) ((wxBitmap&)bitmap).GetArmPixmap (m_mainWidget), - XmNlabelType, XmPIXMAP, - NULL); - } - - XtAddCallback (buttonWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, - (XtPointer) this); - - SetCanAddEventHandler(TRUE); - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + pos.x, pos.y, best.x, best.y); - SetFont(* parent->GetFont()); - - ChangeBackgroundColour (); - - - return TRUE; + return true; } wxBitmapButton::~wxBitmapButton() @@ -127,38 +100,104 @@ wxBitmapButton::~wxBitmapButton() SetBitmapLabel(wxNullBitmap); if (m_insensPixmap) - XmDestroyPixmap (DefaultScreenOfDisplay ((Display*) GetXDisplay()), (Pixmap) m_insensPixmap); + XmDestroyPixmap (DefaultScreenOfDisplay ((Display*) GetXDisplay()), + (Pixmap) m_insensPixmap); } -void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap) +void wxBitmapButton::DoSetBitmap(const wxBitmap& bitmap, State which) { - m_buttonBitmap = bitmap; + m_bitmapsOriginal[which] = bitmap; - if (bitmap.Ok()) + wxBitmapButtonBase::DoSetBitmap(bitmap, which); +} + +void wxBitmapButton::OnSetBitmap() +{ + wxBitmapButtonBase::OnSetBitmap(); + + if ( m_bitmapsOriginal[State_Normal].IsOk() ) { - Pixmap labelPixmap, insensPixmap, armPixmap; + Pixmap pixmap = 0; + Pixmap insensPixmap = 0; + Pixmap armPixmap = 0; + + // Must re-make the bitmap to have its transparent areas drawn + // in the current widget background colour. + if ( m_bitmapsOriginal[State_Normal].GetMask() ) + { + WXPixel backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, + XmNbackground, &backgroundPixel, + NULL); - labelPixmap = (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap(m_mainWidget); + wxColour col; + col.SetPixel(backgroundPixel); - if (m_buttonBitmapSelected.Ok()) - armPixmap = (Pixmap) m_buttonBitmapSelected.GetLabelPixmap(m_mainWidget); + wxBitmap newBitmap = + wxCreateMaskedBitmap(m_bitmapsOriginal[State_Normal], col); + m_bitmaps[State_Normal] = newBitmap; + m_bitmapCache.SetBitmap( m_bitmaps[State_Normal] ); + + pixmap = (Pixmap) m_bitmaps[State_Normal].GetDrawable(); + } else - armPixmap = (Pixmap) ((wxBitmap&)bitmap).GetArmPixmap(m_mainWidget); + { + m_bitmapCache.SetBitmap( m_bitmaps[State_Normal] ); + pixmap = (Pixmap) m_bitmapCache.GetLabelPixmap(m_mainWidget); + } - if (m_buttonBitmapDisabled.Ok()) - insensPixmap = (Pixmap) m_buttonBitmapDisabled.GetLabelPixmap(m_mainWidget); + if (m_bitmapsOriginal[State_Disabled].IsOk()) + { + if (m_bitmapsOriginal[State_Disabled].GetMask()) + { + WXPixel backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, + XmNbackground, &backgroundPixel, + NULL); + + wxColour col; + col.SetPixel(backgroundPixel); + + wxBitmap newBitmap = + wxCreateMaskedBitmap(m_bitmapsOriginal[State_Disabled], col); + m_bitmaps[State_Disabled] = newBitmap; + + insensPixmap = (Pixmap) m_bitmaps[State_Disabled].GetDrawable(); + } + else + insensPixmap = (Pixmap) m_bitmapCache.GetInsensPixmap(m_mainWidget); + } else - insensPixmap = (Pixmap) ((wxBitmap&)bitmap).GetInsensPixmap(m_mainWidget); + insensPixmap = (Pixmap) m_bitmapCache.GetInsensPixmap(m_mainWidget); - if (!insensPixmap || (insensPixmap == labelPixmap)) // <- the Get...Pixmap()-functions return the same pixmap! + // Now make the bitmap representing the armed state + if (m_bitmapsOriginal[State_Pressed].IsOk()) { - insensPixmap = XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget) m_mainWidget)), labelPixmap); - m_insensPixmap = (WXPixmap) insensPixmap; + if (m_bitmapsOriginal[State_Pressed].GetMask()) + { + WXPixel backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, + XmNarmColor, &backgroundPixel, + NULL); + + wxColour col; + col.SetPixel(backgroundPixel); + + wxBitmap newBitmap = + wxCreateMaskedBitmap(m_bitmapsOriginal[State_Pressed], col); + m_bitmaps[State_Pressed] = newBitmap; + + armPixmap = (Pixmap) m_bitmaps[State_Pressed].GetDrawable(); + } + else + armPixmap = (Pixmap) m_bitmapCache.GetArmPixmap(m_mainWidget); } + else + armPixmap = (Pixmap) m_bitmapCache.GetArmPixmap(m_mainWidget); XtVaSetValues ((Widget) m_mainWidget, - XmNlabelPixmap, labelPixmap, - XmNlabelInsensitivePixmap, insensPixmap, + XmNlabelPixmap, pixmap, + XmNlabelInsensitivePixmap, insensPixmap, XmNarmPixmap, armPixmap, XmNlabelType, XmPIXMAP, NULL); @@ -169,27 +208,33 @@ void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap) // since it is no longer valid. XtVaSetValues ((Widget) m_mainWidget, XmNlabelType, XmSTRING, - XmNlabelPixmap, NULL, // TODO: Does this work? - XmNlabelInsensitivePixmap, NULL, - XmNarmPixmap, NULL, + XmNlabelPixmap, XmUNSPECIFIED_PIXMAP, + XmNlabelInsensitivePixmap, XmUNSPECIFIED_PIXMAP, + XmNarmPixmap, XmUNSPECIFIED_PIXMAP, NULL); } } -void wxBitmapButton::SetBitmapSelected(const wxBitmap& sel) +void wxBitmapButton::ChangeBackgroundColour() { - m_buttonBitmapSelected = sel; -}; + wxDoChangeBackgroundColour(m_mainWidget, m_backgroundColour, true); -void wxBitmapButton::SetBitmapFocus(const wxBitmap& focus) -{ - m_buttonBitmapFocus = focus; - // Not used in Motif -}; + // Must reset the bitmaps since the colours have changed. + OnSetBitmap(); +} -void wxBitmapButton::SetBitmapDisabled(const wxBitmap& disabled) +wxSize wxBitmapButton::DoGetBestSize() const { - m_buttonBitmapDisabled = disabled; -}; + wxSize ret( 30,30 ); + if (GetBitmapLabel().IsOk()) + { + int border = HasFlag(wxNO_BORDER) ? 4 : 10; + ret.x += border; + ret.y += border; + + ret += GetBitmapLabel().GetSize(); + } + return ret; +}