]> git.saurik.com Git - wxWidgets.git/blob - src/motif/statbmp.cpp
Avoid crash during global destruction.
[wxWidgets.git] / src / motif / statbmp.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: statbmp.cpp
3 // Purpose: wxStaticBitmap
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 17/09/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "statbmp.h"
14 #endif
15
16 #include "wx/defs.h"
17
18 #include "wx/statbmp.h"
19
20 #ifdef __VMS__
21 #pragma message disable nosimpint
22 #endif
23 #include <Xm/Xm.h>
24 #include <Xm/Label.h>
25 #include <Xm/LabelG.h>
26 #include <Xm/RowColumn.h>
27 #ifdef __VMS__
28 #pragma message enable nosimpint
29 #endif
30
31 #include "wx/motif/private.h"
32
33 IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
34
35 /*
36 * wxStaticBitmap
37 */
38
39 bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
40 const wxBitmap& bitmap,
41 const wxPoint& pos,
42 const wxSize& size,
43 long style,
44 const wxString& name)
45 {
46 m_messageBitmap = bitmap;
47 m_messageBitmapOriginal = bitmap;
48 SetName(name);
49 m_backgroundColour = parent->GetBackgroundColour();
50 m_foregroundColour = parent->GetForegroundColour();
51 if (parent) parent->AddChild(this);
52
53 if ( id == -1 )
54 m_windowId = (int)NewControlId();
55 else
56 m_windowId = id;
57
58 m_windowStyle = style;
59
60 Widget parentWidget = (Widget) parent->GetClientWidget();
61
62 m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("staticBitmap",
63 #if USE_GADGETS
64 xmLabelGadgetClass, parentWidget,
65 #else
66 xmLabelWidgetClass, parentWidget,
67 #endif
68 XmNalignment, XmALIGNMENT_BEGINNING,
69 NULL);
70
71 ChangeBackgroundColour ();
72
73 DoSetBitmap();
74
75 m_font = parent->GetFont();
76 ChangeFont(FALSE);
77
78 wxSize actualSize(size);
79 // work around the cases where the bitmap is a wxNull(Icon/Bitmap)
80 if (actualSize.x == -1)
81 actualSize.x = bitmap.GetWidth() ? bitmap.GetWidth() : 1;
82 if (actualSize.y == -1)
83 actualSize.y = bitmap.GetHeight() ? bitmap.GetHeight() : 1;
84 AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, actualSize.x, actualSize.y);
85
86 return TRUE;
87 }
88
89 wxStaticBitmap::~wxStaticBitmap()
90 {
91 SetBitmap(wxNullBitmap);
92 }
93
94 void wxStaticBitmap::DoSetBitmap()
95 {
96 Widget widget = (Widget) m_mainWidget;
97 int x, y, w1, h1, w2, h2;
98
99 GetPosition(&x, &y);
100
101 if (m_messageBitmapOriginal.Ok())
102 {
103 w2 = m_messageBitmapOriginal.GetWidth();
104 h2 = m_messageBitmapOriginal.GetHeight();
105
106 Pixmap pixmap;
107
108 // Must re-make the bitmap to have its transparent areas drawn
109 // in the current widget background colour.
110 if (m_messageBitmapOriginal.GetMask())
111 {
112 int backgroundPixel;
113 XtVaGetValues( widget, XmNbackground, &backgroundPixel,
114 NULL);
115
116 wxColour col;
117 col.SetPixel(backgroundPixel);
118
119 wxBitmap newBitmap = wxCreateMaskedBitmap(m_messageBitmapOriginal, col);
120 m_messageBitmap = newBitmap;
121
122 pixmap = (Pixmap) m_messageBitmap.GetDrawable();
123 }
124 else
125 {
126 m_bitmapCache.SetBitmap( m_messageBitmap );
127 pixmap = (Pixmap)m_bitmapCache.GetLabelPixmap(widget);
128 }
129
130 XtVaSetValues (widget,
131 XmNlabelPixmap, pixmap,
132 XmNlabelType, XmPIXMAP,
133 NULL);
134 GetSize(&w1, &h1);
135
136 if (! (w1 == w2) && (h1 == h2))
137 SetSize(x, y, w2, h2);
138 }
139 else
140 {
141 // Null bitmap: must not use current pixmap
142 // since it is no longer valid.
143 XtVaSetValues (widget,
144 XmNlabelType, XmSTRING,
145 XmNlabelPixmap, XmUNSPECIFIED_PIXMAP,
146 NULL);
147 }
148 }
149
150 void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap)
151 {
152 m_messageBitmap = bitmap;
153 m_messageBitmapOriginal = bitmap;
154
155 DoSetBitmap();
156 }
157
158 void wxStaticBitmap::ChangeFont(bool keepOriginalSize)
159 {
160 wxWindow::ChangeFont(keepOriginalSize);
161 }
162
163 void wxStaticBitmap::ChangeBackgroundColour()
164 {
165 wxWindow::ChangeBackgroundColour();
166
167 // must recalculate the background colour
168 m_bitmapCache.SetColoursChanged();
169 DoSetBitmap();
170 }
171
172 void wxStaticBitmap::ChangeForegroundColour()
173 {
174 m_bitmapCache.SetColoursChanged();
175 wxWindow::ChangeForegroundColour();
176 }
177