X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3096bd2fa7b88105bc54c08e3c878585de1a9b91..4ca64d4137439844a5e6c95b4da16f32cf7840ab:/src/motif/statbmp.cpp diff --git a/src/motif/statbmp.cpp b/src/motif/statbmp.cpp index 6cc81fe57f..13dd72ae88 100644 --- a/src/motif/statbmp.cpp +++ b/src/motif/statbmp.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: statbmp.cpp +// Name: src/motif/statbmp.cpp // Purpose: wxStaticBitmap // Author: Julian Smart // Modified by: @@ -9,22 +9,24 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "statbmp.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/statbmp.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include #include -#include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) -#endif /* * wxStaticBitmap @@ -37,23 +39,17 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { - m_messageBitmap = bitmap; - SetName(name); - m_backgroundColour = parent->GetBackgroundColour(); - m_foregroundColour = parent->GetForegroundColour(); - if (parent) parent->AddChild(this); - - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; + if( !CreateControl( parent, id, pos, size, style, wxDefaultValidator, + name ) ) + return false; - m_windowStyle = style; + m_messageBitmap = bitmap; + m_messageBitmapOriginal = bitmap; Widget parentWidget = (Widget) parent->GetClientWidget(); m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("staticBitmap", -#if USE_GADGETS +#if wxUSE_GADGETS xmLabelGadgetClass, parentWidget, #else xmLabelWidgetClass, parentWidget, @@ -61,20 +57,22 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, XmNalignment, XmALIGNMENT_BEGINNING, NULL); - XtVaSetValues ((Widget) m_mainWidget, - XmNlabelPixmap, (Pixmap) ((wxBitmap&)bitmap).GetLabelPixmap (m_mainWidget), - XmNlabelType, XmPIXMAP, - NULL); + ChangeBackgroundColour (); - m_font = parent->GetFont(); - ChangeFont(FALSE); + DoSetBitmap(); - SetCanAddEventHandler(TRUE); - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); + ChangeFont(false); - ChangeBackgroundColour (); + wxSize actualSize(size); + // work around the cases where the bitmap is a wxNull(Icon/Bitmap) + if (actualSize.x == -1) + actualSize.x = bitmap.Ok() ? bitmap.GetWidth() : 1; + if (actualSize.y == -1) + actualSize.y = bitmap.Ok() ? bitmap.GetHeight() : 1; + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + pos.x, pos.y, actualSize.x, actualSize.y); - return TRUE; + return true; } wxStaticBitmap::~wxStaticBitmap() @@ -82,27 +80,46 @@ wxStaticBitmap::~wxStaticBitmap() SetBitmap(wxNullBitmap); } -void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap) +void wxStaticBitmap::DoSetBitmap() { - m_messageBitmap = bitmap; - Widget widget = (Widget) m_mainWidget; - int x, y, w1, h1, w2, h2; - - GetPosition(&x, &y); + int w2, h2; - if (bitmap.Ok()) + if (m_messageBitmapOriginal.Ok()) { - w2 = bitmap.GetWidth(); - h2 = bitmap.GetHeight(); + w2 = m_messageBitmapOriginal.GetWidth(); + h2 = m_messageBitmapOriginal.GetHeight(); + + Pixmap pixmap; + + // Must re-make the bitmap to have its transparent areas drawn + // in the current widget background colour. + if (m_messageBitmapOriginal.GetMask()) + { + WXPixel backgroundPixel; + XtVaGetValues( widget, XmNbackground, &backgroundPixel, + NULL); + + wxColour col; + col.SetPixel(backgroundPixel); + + wxBitmap newBitmap = wxCreateMaskedBitmap(m_messageBitmapOriginal, col); + m_messageBitmap = newBitmap; + + pixmap = (Pixmap) m_messageBitmap.GetDrawable(); + } + else + { + m_bitmapCache.SetBitmap( m_messageBitmap ); + pixmap = (Pixmap)m_bitmapCache.GetLabelPixmap(widget); + } + XtVaSetValues (widget, - XmNlabelPixmap, ((wxBitmap&)bitmap).GetLabelPixmap (widget), + XmNlabelPixmap, pixmap, XmNlabelType, XmPIXMAP, NULL); - GetSize(&w1, &h1); - if (! (w1 == w2) && (h1 == h2)) - SetSize(x, y, w2, h2); + SetSize(w2, h2); } else { @@ -115,18 +132,25 @@ void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap) } } -void wxStaticBitmap::ChangeFont(bool keepOriginalSize) +void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap) { - wxWindow::ChangeFont(keepOriginalSize); + m_messageBitmap = bitmap; + m_messageBitmapOriginal = bitmap; + + DoSetBitmap(); } void wxStaticBitmap::ChangeBackgroundColour() { wxWindow::ChangeBackgroundColour(); + + // must recalculate the background colour + m_bitmapCache.SetColoursChanged(); + DoSetBitmap(); } void wxStaticBitmap::ChangeForegroundColour() { + m_bitmapCache.SetColoursChanged(); wxWindow::ChangeForegroundColour(); } -