X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da175b2ce4dc35cc4c0baa8bbdc16bf4de6c7684..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/motif/bmpbuttn.cpp diff --git a/src/motif/bmpbuttn.cpp b/src/motif/bmpbuttn.cpp index bf9a57a63f..7a2c68e90e 100644 --- a/src/motif/bmpbuttn.cpp +++ b/src/motif/bmpbuttn.cpp @@ -1,75 +1,62 @@ ///////////////////////////////////////////////////////////////////////////// -// 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" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __VMS +#define XtScreen XTSCREEN #endif #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 ); +// Pixmap XCreateInsensitivePixmap( Display *display, Pixmap pixmap ); -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) -#endif 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, +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; - m_buttonBitmapOriginal = bitmap; - m_buttonBitmapSelected = bitmap; - m_buttonBitmapSelectedOriginal = 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; + + m_bmpNormal = m_bmpNormalOriginal = bitmap; + m_bmpSelected = m_bmpSelectedOriginal = bitmap; + Widget parentWidget = (Widget) parent->GetClientWidget(); - + /* * Patch Note (important) * There is no major reason to put a defaultButtonThickness here. @@ -80,151 +67,161 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bit * in the ::SetDefaultButton method. */ Widget buttonWidget = XtVaCreateManagedWidget ("button", - + // Gadget causes problems for default button operation. #if wxUSE_GADGETS xmPushButtonGadgetClass, parentWidget, #else xmPushButtonWidgetClass, parentWidget, #endif - // XmNdefaultButtonShadowThickness, 1, // See comment for wxButton::SetDefault + // See comment for wxButton::SetDefault + // XmNdefaultButtonShadowThickness, 1, + XmNrecomputeSize, False, NULL); - + m_mainWidget = (WXWidget) buttonWidget; - - m_font = parent->GetFont(); - ChangeFont(FALSE); - + + ChangeFont(false); + ChangeBackgroundColour (); - + DoSetBitmap(); - - XtAddCallback (buttonWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, - (XtPointer) this); - - SetCanAddEventHandler(TRUE); - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); - - return TRUE; + + XtAddCallback (buttonWidget, + XmNactivateCallback, (XtCallbackProc) wxButtonCallback, + (XtPointer) this); + + wxSize best = m_bmpNormal.Ok() ? GetBestSize() : wxSize(30, 30); + if( size.x != -1 ) best.x = size.x; + if( size.y != -1 ) best.y = size.y; + + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + pos.x, pos.y, best.x, best.y); + + return true; } 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) { - m_buttonBitmapOriginal = bitmap; - m_buttonBitmap = bitmap; - + m_bmpNormalOriginal = bitmap; + m_bmpNormal = bitmap; + DoSetBitmap(); } void wxBitmapButton::SetBitmapSelected(const wxBitmap& sel) { - m_buttonBitmapSelected = sel; - m_buttonBitmapSelectedOriginal = sel; - + m_bmpSelected = sel; + m_bmpSelectedOriginal = sel; + DoSetBitmap(); -}; +} void wxBitmapButton::SetBitmapFocus(const wxBitmap& focus) { - m_buttonBitmapFocus = focus; + m_bmpFocus = focus; // Not used in Motif -}; +} void wxBitmapButton::SetBitmapDisabled(const wxBitmap& disabled) { - m_buttonBitmapDisabled = disabled; - m_buttonBitmapDisabledOriginal = disabled; - + m_bmpDisabled = disabled; + m_bmpDisabledOriginal = disabled; + DoSetBitmap(); -}; +} void wxBitmapButton::DoSetBitmap() { - if (m_buttonBitmapOriginal.Ok()) + if (m_bmpNormalOriginal.Ok()) { 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_buttonBitmapOriginal.GetMask()) + if (m_bmpNormalOriginal.GetMask()) { - int backgroundPixel; - XtVaGetValues((Widget) m_mainWidget, XmNbackground, &backgroundPixel, - NULL); - + WXPixel backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, + XmNbackground, &backgroundPixel, + NULL); + wxColour col; col.SetPixel(backgroundPixel); - - wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapOriginal, col); - m_buttonBitmap = newBitmap; - - pixmap = (Pixmap) m_buttonBitmap.GetPixmap(); + + wxBitmap newBitmap = + wxCreateMaskedBitmap(m_bmpNormalOriginal, col); + m_bmpNormal = newBitmap; + m_bitmapCache.SetBitmap( m_bmpNormal ); + + pixmap = (Pixmap) m_bmpNormal.GetDrawable(); } else - pixmap = (Pixmap) m_buttonBitmap.GetLabelPixmap(m_mainWidget); - - if (m_buttonBitmapDisabledOriginal.Ok()) { - if (m_buttonBitmapDisabledOriginal.GetMask()) + m_bitmapCache.SetBitmap( m_bmpNormal ); + pixmap = (Pixmap) m_bitmapCache.GetLabelPixmap(m_mainWidget); + } + + if (m_bmpDisabledOriginal.Ok()) + { + if (m_bmpDisabledOriginal.GetMask()) { - int backgroundPixel; - XtVaGetValues((Widget) m_mainWidget, XmNbackground, &backgroundPixel, - NULL); - + WXPixel backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, + XmNbackground, &backgroundPixel, + NULL); + wxColour col; col.SetPixel(backgroundPixel); - - wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapDisabledOriginal, col); - m_buttonBitmapDisabled = newBitmap; - - insensPixmap = (Pixmap) m_buttonBitmapDisabled.GetPixmap(); + + wxBitmap newBitmap = + wxCreateMaskedBitmap(m_bmpDisabledOriginal, col); + m_bmpDisabled = newBitmap; + + insensPixmap = (Pixmap) m_bmpDisabled.GetDrawable(); } else - insensPixmap = (Pixmap) m_buttonBitmap.GetInsensPixmap(m_mainWidget); + insensPixmap = (Pixmap) m_bitmapCache.GetInsensPixmap(m_mainWidget); } else - insensPixmap = (Pixmap) m_buttonBitmap.GetInsensPixmap(m_mainWidget); - + insensPixmap = (Pixmap) m_bitmapCache.GetInsensPixmap(m_mainWidget); + // Now make the bitmap representing the armed state - if (m_buttonBitmapSelectedOriginal.Ok()) + if (m_bmpSelectedOriginal.Ok()) { - if (m_buttonBitmapSelectedOriginal.GetMask()) + if (m_bmpSelectedOriginal.GetMask()) { - int backgroundPixel; - XtVaGetValues((Widget) m_mainWidget, XmNarmColor, &backgroundPixel, - NULL); - + WXPixel backgroundPixel; + XtVaGetValues((Widget) m_mainWidget, + XmNarmColor, &backgroundPixel, + NULL); + wxColour col; col.SetPixel(backgroundPixel); - - wxBitmap newBitmap = wxCreateMaskedBitmap(m_buttonBitmapSelectedOriginal, col); - m_buttonBitmapSelected = newBitmap; - - armPixmap = (Pixmap) m_buttonBitmapSelected.GetPixmap(); + + wxBitmap newBitmap = + wxCreateMaskedBitmap(m_bmpSelectedOriginal, col); + m_bmpSelected = newBitmap; + + armPixmap = (Pixmap) m_bmpSelected.GetDrawable(); } else - armPixmap = (Pixmap) m_buttonBitmap.GetArmPixmap(m_mainWidget); + armPixmap = (Pixmap) m_bitmapCache.GetArmPixmap(m_mainWidget); } else - armPixmap = (Pixmap) m_buttonBitmap.GetArmPixmap(m_mainWidget); - - if (insensPixmap == pixmap) // <- the Get...Pixmap()-functions return the same pixmap! - { - insensPixmap = - XCreateInsensitivePixmap(DisplayOfScreen(XtScreen((Widget) m_mainWidget)), pixmap); - m_insensPixmap = (WXPixmap) insensPixmap; - } - + armPixmap = (Pixmap) m_bitmapCache.GetArmPixmap(m_mainWidget); + XtVaSetValues ((Widget) m_mainWidget, XmNlabelPixmap, pixmap, XmNlabelInsensitivePixmap, insensPixmap, @@ -247,8 +244,22 @@ void wxBitmapButton::DoSetBitmap() void wxBitmapButton::ChangeBackgroundColour() { - DoChangeBackgroundColour(m_mainWidget, m_backgroundColour, TRUE); - + wxDoChangeBackgroundColour(m_mainWidget, m_backgroundColour, true); + // Must reset the bitmaps since the colours have changed. DoSetBitmap(); } + +wxSize wxBitmapButton::DoGetBestSize() const +{ + wxSize ret( 30,30 ); + + if (m_bmpNormal.Ok()) + { + int border = (GetWindowStyle() & wxNO_BORDER) ? 4 : 10; + ret.x = m_bmpNormal.GetWidth()+border; + ret.y = m_bmpNormal.GetHeight()+border; + } + + return ret; +}