X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..046d682f0f684977b7ba933a128f5c84e06ded0e:/src/motif/statbmp.cpp diff --git a/src/motif/statbmp.cpp b/src/motif/statbmp.cpp index 05acdc7411..5d39f69069 100644 --- a/src/motif/statbmp.cpp +++ b/src/motif/statbmp.cpp @@ -6,18 +6,33 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "statbmp.h" #endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#include "wx/defs.h" + #include "wx/statbmp.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) +#ifdef __VMS__ +#pragma message disable nosimpint #endif +#include +#include +#include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif + +#include "wx/motif/private.h" + +IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) /* * wxStaticBitmap @@ -30,30 +45,119 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { + if( !CreateControl( parent, id, pos, size, style, wxDefaultValidator, + name ) ) + return false; + m_messageBitmap = bitmap; - SetName(name); - if (parent) parent->AddChild(this); + m_messageBitmapOriginal = bitmap; - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; + Widget parentWidget = (Widget) parent->GetClientWidget(); - m_windowStyle = style; + m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("staticBitmap", +#if USE_GADGETS + xmLabelGadgetClass, parentWidget, +#else + xmLabelWidgetClass, parentWidget, +#endif + XmNalignment, XmALIGNMENT_BEGINNING, + NULL); + + ChangeBackgroundColour (); + + DoSetBitmap(); + + ChangeFont(false); - // TODO: create static bitmap control - return FALSE; + 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; } -void wxStaticBitmap::SetSize(int x, int y, int width, int height, int sizeFlags) +wxStaticBitmap::~wxStaticBitmap() { - // TODO + SetBitmap(wxNullBitmap); +} + +void wxStaticBitmap::DoSetBitmap() +{ + Widget widget = (Widget) m_mainWidget; + int w2, h2; + + if (m_messageBitmapOriginal.Ok()) + { + 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()) + { + int 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, pixmap, + XmNlabelType, XmPIXMAP, + NULL); + + SetSize(w2, h2); + } + else + { + // Null bitmap: must not use current pixmap + // since it is no longer valid. + XtVaSetValues (widget, + XmNlabelType, XmSTRING, + XmNlabelPixmap, XmUNSPECIFIED_PIXMAP, + NULL); + } } void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap) { m_messageBitmap = bitmap; + m_messageBitmapOriginal = bitmap; + + DoSetBitmap(); +} + +void wxStaticBitmap::ChangeBackgroundColour() +{ + wxWindow::ChangeBackgroundColour(); + + // must recalculate the background colour + m_bitmapCache.SetColoursChanged(); + DoSetBitmap(); +} - // TODO: redraw bitmap +void wxStaticBitmap::ChangeForegroundColour() +{ + m_bitmapCache.SetColoursChanged(); + wxWindow::ChangeForegroundColour(); }