Files
wxWidgets/src/motif/statbmp.cpp
Mattia Barbon c8ec0b3d36 Allow initialising wxStaticBitamp with wxNullBitmap/wxNullIcon,
automatically resize the control to match the bitmap (as wxMSW does).


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20749 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2003-05-27 20:34:13 +00:00

161 lines
3.9 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: statbmp.cpp
// Purpose: wxStaticBitmap
// Author: Julian Smart
// Modified by:
// Created: 17/09/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "statbmp.h"
#endif
#include "wx/defs.h"
#include "wx/statbmp.h"
#ifdef __VMS__
#pragma message disable nosimpint
#endif
#include <Xm/Xm.h>
#include <Xm/Label.h>
#include <Xm/LabelG.h>
#ifdef __VMS__
#pragma message enable nosimpint
#endif
#include "wx/motif/private.h"
IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
/*
* wxStaticBitmap
*/
bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
const wxBitmap& bitmap,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name)
{
if( !CreateControl( parent, id, pos, size, style, wxDefaultValidator,
name ) )
return false;
m_messageBitmap = bitmap;
m_messageBitmapOriginal = bitmap;
Widget parentWidget = (Widget) parent->GetClientWidget();
m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("staticBitmap",
#if USE_GADGETS
xmLabelGadgetClass, parentWidget,
#else
xmLabelWidgetClass, parentWidget,
#endif
XmNalignment, XmALIGNMENT_BEGINNING,
NULL);
ChangeBackgroundColour ();
DoSetBitmap();
ChangeFont(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;
}
wxStaticBitmap::~wxStaticBitmap()
{
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();
}
void wxStaticBitmap::ChangeForegroundColour()
{
m_bitmapCache.SetColoursChanged();
wxWindow::ChangeForegroundColour();
}