]> git.saurik.com Git - wxWidgets.git/blob - src/os2/gauge.cpp
ICCCM says that the TIMESTAMP atom is required, so provide it. This is patch 1424755...
[wxWidgets.git] / src / os2 / gauge.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: gauge.cpp
3 // Purpose: wxGauge class
4 // Author: David Webster
5 // Modified by:
6 // Created: 10/06/99
7 // RCS-ID: $Id$
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #include "wx/wxprec.h"
13
14 #ifndef WX_PRECOMP
15 #include "wx/defs.h"
16 #include "wx/utils.h"
17 #include "wx/scrolwin.h"
18 #endif
19
20 #include "wx/os2/private.h"
21 #include "wx/gauge.h"
22
23 static WXFARPROC fnWndProcGauge = (WXFARPROC)NULL;
24 extern void wxAssociateWinWithHandle( HWND hWnd
25 ,wxWindowOS2* pWin
26 );
27
28 IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
29
30 MRESULT EXPENTRY wxGaugeWndProc(
31 HWND hWnd
32 , UINT uMessage
33 , MPARAM wParam
34 , MPARAM lParam
35 )
36 {
37 wxGauge* pGauge = (wxGauge *)::WinQueryWindowULong( hWnd
38 ,QWL_USER
39 );
40 HPS hPS;
41 RECTL vRect;
42 RECTL vRect2;
43 RECTL vRect3;
44 double dPixelToRange = 0.0;
45 double dRange = 0.0;
46
47 switch (uMessage )
48 {
49 case WM_PAINT:
50 hPS = ::WinBeginPaint( hWnd
51 ,NULLHANDLE
52 ,&vRect
53 );
54 if(hPS)
55 {
56 ::WinQueryWindowRect(hWnd, &vRect);
57 ::GpiCreateLogColorTable( hPS
58 ,0L
59 ,LCOLF_CONSECRGB
60 ,0L
61 ,(LONG)wxTheColourDatabase->m_nSize
62 ,(PLONG)wxTheColourDatabase->m_palTable
63 );
64 ::GpiCreateLogColorTable( hPS
65 ,0L
66 ,LCOLF_RGB
67 ,0L
68 ,0L
69 ,NULL
70 );
71 //
72 // Draw the guage box
73 //
74 LONG lColor = 0x00FFFFFF; // White
75 POINTL vPoint = {vRect.xLeft + 1, vRect.yBottom + 1};
76
77 ::GpiSetColor(hPS, lColor);
78 ::GpiMove(hPS, &vPoint);
79 vPoint.x = vRect.xRight - 1;
80 ::GpiLine(hPS, &vPoint);
81 vPoint.y = vRect.yTop - 1;
82 ::GpiLine(hPS, &vPoint);
83 lColor = 0x000C0C0C; // Darkish Grey to give depth feel
84 ::GpiSetColor(hPS, lColor);
85 vPoint.x = vRect.xLeft + 1;
86 ::GpiLine(hPS, &vPoint);
87 vPoint.y = vRect.yBottom + 1;
88 ::GpiLine(hPS, &vPoint);
89 vRect3.xLeft = vRect.xLeft + 2;
90 vRect3.xRight = vRect.xRight - 2;
91 vRect3.yTop = vRect.yTop - 2;
92 vRect3.yBottom = vRect.yBottom + 2;
93
94 if (pGauge->GetWindowStyleFlag() & wxGA_VERTICAL)
95 {
96 dRange = (double)(vRect3.yTop - vRect3.yBottom);
97 dPixelToRange = dRange/(double)pGauge->GetRange();
98 vRect2.yTop = (int)(pGauge->GetValue() * dPixelToRange);
99 vRect2.yBottom = vRect3.yBottom;
100 vRect2.xLeft = vRect3.xLeft;
101 vRect2.xRight = vRect3.xRight;
102 vRect3.yBottom = vRect2.yTop;
103 if (vRect3.yBottom <= 1)
104 vRect3.yBottom = 2;
105 ::WinFillRect(hPS, &vRect3, pGauge->GetBackgroundColour().GetPixel());
106 ::WinFillRect(hPS, &vRect2, pGauge->GetForegroundColour().GetPixel());
107 }
108 else
109 {
110 dRange = (double)(vRect3.xRight - vRect3.xLeft);
111 dPixelToRange = dRange/(double)pGauge->GetRange();
112 vRect2.yTop = vRect3.yTop;
113 vRect2.yBottom = vRect3.yBottom;
114 vRect2.xLeft = vRect3.xLeft;
115 vRect2.xRight = (int)(pGauge->GetValue() * dPixelToRange);
116 vRect3.xLeft = vRect2.xRight;
117 if (vRect3.xLeft <= 1)
118 vRect3.xLeft = 2;
119 ::WinFillRect(hPS, &vRect3, pGauge->GetBackgroundColour().GetPixel());
120 ::WinFillRect(hPS, &vRect2, pGauge->GetForegroundColour().GetPixel());
121 }
122 ::WinEndPaint(hPS);
123 }
124 }
125 return (fnWndProcGauge( hWnd
126 ,(ULONG)uMessage
127 ,(MPARAM)wParam
128 ,(MPARAM)lParam
129 )
130 );
131 } // end of wxGaugeWndProc
132
133 bool wxGauge::Create(
134 wxWindowOS2* pParent
135 , wxWindowID vId
136 , int nRange
137 , const wxPoint& rPos
138 , const wxSize& rSize
139 , long lStyle
140 , const wxValidator& rValidator
141 , const wxString& rsName
142 )
143 {
144 int nX = rPos.x;
145 int nY = rPos.y;
146 int nWidth = rSize.x;
147 int nHeight = rSize.y;
148 long lMsStyle = 0L;
149 SWP vSwp;
150
151 SetName(rsName);
152 #if wxUSE_VALIDATORS
153 SetValidator(rValidator);
154 #endif
155 if (pParent)
156 pParent->AddChild(this);
157 m_backgroundColour.Set(wxString(wxT("LIGHT GREY")));
158 m_foregroundColour.Set(wxString(wxT("NAVY")));
159
160 m_nRangeMax = nRange;
161 m_nGaugePos = 0;
162 m_windowStyle = lStyle;
163
164 if (vId == -1)
165 m_windowId = (int)NewControlId();
166 else
167 m_windowId = vId;
168
169 if (m_windowStyle & wxCLIP_SIBLINGS )
170 lMsStyle |= WS_CLIPSIBLINGS;
171
172 //
173 // OS/2 will use an edit control for this, since there is not a native gauge
174 // Other choices include using an armless slider but they are more difficult
175 // to control and manipulate
176 //
177
178 lMsStyle = WS_VISIBLE | ES_MARGIN | ES_LEFT | ES_READONLY;
179 if (m_windowStyle & wxCLIP_SIBLINGS)
180 lMsStyle |= WS_CLIPSIBLINGS;
181
182 m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
183 ,WC_ENTRYFIELD // Window class
184 ,(PSZ)NULL // Initial Text
185 ,(ULONG)lMsStyle // Style flags
186 ,0L, 0L, 0L, 0L // Origin -- 0 size
187 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
188 ,HWND_TOP // initial z position
189 ,(HMENU)m_windowId // Window identifier
190 ,NULL // Slider control data
191 ,NULL // no Presentation parameters
192 );
193
194 wxAssociateWinWithHandle( m_hWnd
195 ,(wxWindowOS2*)this
196 );
197 ::WinSetWindowULong(GetHwnd(), QWL_USER, (LONG)this);
198 fnWndProcGauge = (WXFARPROC)::WinSubclassWindow(m_hWnd, (PFNWP)wxGaugeWndProc);
199 ::WinQueryWindowPos(m_hWnd, &vSwp);
200 SetXComp(vSwp.x);
201 SetYComp(vSwp.y);
202 wxFont* pTextFont = new wxFont( 10
203 ,wxMODERN
204 ,wxNORMAL
205 ,wxNORMAL
206 );
207 SetFont(*pTextFont);
208 if (nWidth == -1L)
209 nWidth = 50L;
210 if (nHeight == -1L)
211 nHeight = 28L;
212 SetSize( nX
213 ,nY
214 ,nWidth
215 ,nHeight
216 );
217 m_nWidth = nWidth; // Save for GetBestSize
218 m_nHeight = nHeight;
219 ::WinShowWindow((HWND)GetHWND(), TRUE);
220 delete pTextFont;
221 return TRUE;
222 } // end of wxGauge::Create
223
224 int wxGauge::GetBezelFace() const
225 {
226 return 0;
227 } // end of wxGauge::GetBezelFace
228
229 int wxGauge::GetRange() const
230 {
231 return m_nRangeMax;
232 } // end of wxGauge::GetRange
233
234 int wxGauge::GetShadowWidth() const
235 {
236 return 0;
237 } // end of wxGauge::GetShadowWidth
238
239 int wxGauge::GetValue() const
240 {
241 return m_nGaugePos;
242 } // end of wxGauge::GetValue
243
244 bool wxGauge::SetBackgroundColour(
245 const wxColour& rColour
246 )
247 {
248 if (!wxControl::SetBackgroundColour(rColour))
249 return FALSE;
250
251 LONG lColor = (LONG)rColour.GetPixel();
252
253 ::WinSetPresParam( GetHwnd()
254 ,PP_BACKGROUNDCOLOR
255 ,sizeof(LONG)
256 ,(PVOID)&lColor
257 );
258 return TRUE;
259 } // end of wxGauge::SetBackgroundColour
260
261 void wxGauge::SetBezelFace(
262 int WXUNUSED(nWidth)
263 )
264 {
265 } // end of wxGauge::SetBezelFace
266
267 bool wxGauge::SetForegroundColour(
268 const wxColour& rColour
269 )
270 {
271 if (!wxControl::SetForegroundColour(rColour))
272 return FALSE;
273
274 LONG lColor = (LONG)rColour.GetPixel();
275
276 ::WinSetPresParam( GetHwnd()
277 ,PP_FOREGROUNDCOLOR
278 ,sizeof(LONG)
279 ,(PVOID)&lColor
280 );
281
282 return TRUE;
283 } // end of wxGauge::SetForegroundColour
284
285 void wxGauge::SetRange(
286 int nRange
287 )
288 {
289 m_nRangeMax = nRange;
290 } // end of wxGauge::SetRange
291
292 void wxGauge::SetShadowWidth(
293 int WXUNUSED(nWidth)
294 )
295 {
296 } // end of wxGauge::SetShadowWidth
297
298 void wxGauge::SetValue(
299 int nPos
300 )
301 {
302 RECT vRect;
303
304 m_nGaugePos = nPos;
305 ::WinQueryWindowRect(GetHwnd(), &vRect);
306 ::WinInvalidateRect(GetHwnd(), &vRect, FALSE);
307 } // end of wxGauge::SetValue
308
309 wxSize wxGauge::DoGetBestSize() const
310 {
311 return wxSize(m_nWidth,m_nHeight);
312 }