]> git.saurik.com Git - wxWidgets.git/blame - src/os2/window.cpp
fix to wxLocale::GetString() calld with empty argument
[wxWidgets.git] / src / os2 / window.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: windows.cpp
3// Purpose: wxWindow
cdf1e714 4// Author: David Webster
0e320a79 5// Modified by:
cdf1e714 6// Created: 10/12/99
0e320a79 7// RCS-ID: $Id$
cdf1e714
DW
8// Copyright: (c) David Webster
9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
a885d89a 12//
cdf1e714 13// For compilers that support precompilation, includes "wx.h".
a885d89a 14//
cdf1e714 15#include "wx/wxprec.h"
0e320a79 16
849949b1
DW
17#ifndef WX_PRECOMP
18 #define INCL_DOS
19 #define INCL_PM
20 #include <os2.h>
21 #include "wx/window.h"
22 #include "wx/accel.h"
23 #include "wx/setup.h"
24 #include "wx/menu.h"
25 #include "wx/dc.h"
26 #include "wx/dcclient.h"
27 #include "wx/utils.h"
28 #include "wx/app.h"
29 #include "wx/panel.h"
30 #include "wx/layout.h"
31 #include "wx/dialog.h"
32 #include "wx/frame.h"
33 #include "wx/listbox.h"
34 #include "wx/button.h"
35 #include "wx/msgdlg.h"
19193a2c 36 #include "wx/scrolwin.h"
849949b1
DW
37
38 #include <stdio.h>
39#endif
40
41#if wxUSE_OWNER_DRAWN
42 #include "wx/ownerdrw.h"
43#endif
44
45#if wxUSE_DRAG_AND_DROP
46 #include "wx/dnd.h"
47#endif
0e320a79
DW
48
49#include "wx/menuitem.h"
50#include "wx/log.h"
51
cdf1e714
DW
52#include "wx/os2/private.h"
53
849949b1
DW
54#if wxUSE_TOOLTIPS
55 #include "wx/tooltip.h"
0e320a79
DW
56#endif
57
849949b1
DW
58#if wxUSE_CARET
59 #include "wx/caret.h"
60#endif // wxUSE_CARET
61
62#include "wx/intl.h"
63#include "wx/log.h"
64
65
66#include "wx/textctrl.h"
67
0e320a79
DW
68#include <string.h>
69
a885d89a
DW
70//
71// Place compiler, OS specific includes here
72//
849949b1 73
a885d89a
DW
74//
75// Standard macros -- these are for OS/2 PM, but most GUI's have something similar
76//
849949b1 77#ifndef GET_X_LPARAM
a885d89a 78//
849949b1 79// SHORT1FROMMP -- LOWORD
a885d89a 80//
849949b1 81 #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp))
a885d89a 82//
849949b1 83// SHORT2FROMMP -- HIWORD
a885d89a 84//
849949b1
DW
85 #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16))
86#endif // GET_X_LPARAM
87
29a99be3
DW
88#ifndef CW_USEDEFAULT
89# define CW_USEDEFAULT ((int)0x80000000)
90#endif
91
849949b1
DW
92// ---------------------------------------------------------------------------
93// global variables
94// ---------------------------------------------------------------------------
95
a885d89a 96//
19193a2c 97// The last PM message we got (MT-UNSAFE)
a885d89a 98//
61243a51 99QMSG s_currentMsg;
849949b1 100
19193a2c 101#if wxUSE_MENUS_NATIVE
a885d89a 102wxMenu* wxCurrentPopupMenu = NULL;
19193a2c
KB
103#endif // wxUSE_MENUS_NATIVE
104
8138a3b0
SN
105#if !defined(__VISAGECPP__) || (__IBMCPP__ < 400)
106extern wxChar wxCanvasClassName[];
61243a51 107#endif
a885d89a 108wxList* wxWinHandleList = NULL;
849949b1
DW
109
110// ---------------------------------------------------------------------------
111// private functions
112// ---------------------------------------------------------------------------
a885d89a
DW
113
114//
849949b1 115// the window proc for all our windows; most gui's have something similar
a885d89a 116//
f23208ca
DW
117MRESULT EXPENTRY wxWndProc( HWND hWnd
118 ,ULONG message
119 ,MPARAM mp1
120 ,MPARAM mp2
121 );
11e59d47
DW
122
123#ifdef __WXDEBUG__
124 const char *wxGetMessageName(int message);
125#endif //__WXDEBUG__
126
19193a2c
KB
127void wxRemoveHandleAssociation(wxWindowOS2* pWin);
128void wxAssociateWinWithHandle( HWND hWnd
129 ,wxWindowOS2* pWin
a885d89a
DW
130 );
131wxWindow* wxFindWinFromHandle(WXHWND hWnd);
849949b1 132
a885d89a
DW
133//
134// This magical function is used to translate VK_APPS key presses to right
135// mouse clicks
136//
19193a2c
KB
137// Unused?
138#if 0
a885d89a
DW
139static void TranslateKbdEventToMouse( wxWindow* pWin
140 ,int* pX
141 ,int* pY
142 ,MPARAM* pFlags
143 );
19193a2c 144#endif
a885d89a
DW
145//
146// get the current state of SHIFT/CTRL keys
147//
148static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000) != 0; }
149static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000) != 0; }
849949b1
DW
150// ---------------------------------------------------------------------------
151// event tables
152// ---------------------------------------------------------------------------
0e320a79 153
19193a2c
KB
154// in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu()
155// method
156#ifdef __WXUNIVERSAL__
157 IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2, wxWindowBase)
158#else // __WXPM__
849949b1 159 IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
19193a2c 160#endif // __WXUNIVERSAL__/__WXPM__
0e320a79 161
19193a2c 162BEGIN_EVENT_TABLE(wxWindowOS2, wxWindowBase)
0367c1c0
DW
163 EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground)
164 EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged)
165 EVT_INIT_DIALOG(wxWindowOS2::OnInitDialog)
166 EVT_IDLE(wxWindowOS2::OnIdle)
167 EVT_SET_FOCUS(wxWindowOS2::OnSetFocus)
849949b1 168END_EVENT_TABLE()
0e320a79 169
849949b1
DW
170// ===========================================================================
171// implementation
172// ===========================================================================
0e320a79 173
19193a2c
KB
174// ---------------------------------------------------------------------------
175// wxWindow utility functions
176// ---------------------------------------------------------------------------
177
a885d89a 178//
776d87d5 179// Find an item given the PM Window id
a885d89a 180//
0367c1c0 181wxWindow* wxWindowOS2::FindItem(
a885d89a 182 long lId
776d87d5 183) const
cdf1e714 184{
19193a2c
KB
185#if wxUSE_CONTROLS
186 wxControl* pItem = wxDynamicCast(this, wxControl);
a885d89a
DW
187
188 if (pItem)
189 {
190 //
191 // I it we or one of our "internal" children?
192 //
19193a2c
KB
193 if (pItem->GetId() == lId
194#ifndef __WXUNIVERSAL__
195 || (pItem->GetSubcontrols().Index(lId) != wxNOT_FOUND)
196#endif
197 )
a885d89a
DW
198 {
199 return pItem;
200 }
201 }
19193a2c 202#endif // wxUSE_CONTROLS
a885d89a 203
776d87d5
DW
204 wxWindowList::Node* pCurrent = GetChildren().GetFirst();
205
206 while (pCurrent)
cdf1e714 207 {
776d87d5 208 wxWindow* pChildWin = pCurrent->GetData();
a885d89a 209 wxWindow* pWnd = pChildWin->FindItem(lId);
cdf1e714 210
776d87d5
DW
211 if (pWnd)
212 return pWnd;
cdf1e714 213
776d87d5 214 pCurrent = pCurrent->GetNext();
cdf1e714 215 }
776d87d5 216 return(NULL);
0367c1c0 217} // end of wxWindowOS2::FindItem
cdf1e714 218
a885d89a 219//
776d87d5 220// Find an item given the PM Window handle
a885d89a 221//
0367c1c0 222wxWindow* wxWindowOS2::FindItemByHWND(
776d87d5
DW
223 WXHWND hWnd
224, bool bControlOnly
225) const
cdf1e714 226{
776d87d5
DW
227 wxWindowList::Node* pCurrent = GetChildren().GetFirst();
228
229 while (pCurrent)
cdf1e714 230 {
776d87d5 231 wxWindow* pParent = pCurrent->GetData();
cdf1e714 232
a885d89a 233 //
cdf1e714 234 // Do a recursive search.
a885d89a 235 //
776d87d5
DW
236 wxWindow* pWnd = pParent->FindItemByHWND(hWnd);
237
238 if (pWnd)
239 return(pWnd);
cdf1e714 240
19193a2c
KB
241 if (!bControlOnly
242#if wxUSE_CONTROLS
243 || pParent->IsKindOf(CLASSINFO(wxControl))
244#endif // wxUSE_CONTROLS
245 )
cdf1e714 246 {
776d87d5
DW
247 wxWindow* pItem = pCurrent->GetData();
248
249 if (pItem->GetHWND() == hWnd)
250 return(pItem);
cdf1e714
DW
251 else
252 {
776d87d5
DW
253 if (pItem->ContainsHWND(hWnd))
254 return(pItem);
cdf1e714
DW
255 }
256 }
776d87d5 257 pCurrent = pCurrent->GetNext();
cdf1e714 258 }
776d87d5 259 return(NULL);
0367c1c0 260} // end of wxWindowOS2::FindItemByHWND
cdf1e714 261
a885d89a 262//
cdf1e714 263// Default command handler
a885d89a 264//
0367c1c0 265bool wxWindowOS2::OS2Command(
776d87d5
DW
266 WXUINT WXUNUSED(uParam)
267, WXWORD WXUNUSED(uId)
268)
cdf1e714 269{
776d87d5 270 return(FALSE);
cdf1e714
DW
271}
272
273// ----------------------------------------------------------------------------
274// constructors and such
275// ----------------------------------------------------------------------------
276
0367c1c0 277void wxWindowOS2::Init()
0e320a79 278{
a885d89a
DW
279 //
280 // Generic
281 //
849949b1 282 InitBase();
0e320a79 283
a885d89a 284 //
849949b1 285 // PM specific
a885d89a 286 //
776d87d5
DW
287 m_bDoubleClickAllowed = 0;
288 m_bWinCaptured = FALSE;
cdf1e714 289
849949b1 290 m_isBeingDeleted = FALSE;
776d87d5
DW
291 m_fnOldWndProc = 0;
292 m_bUseCtl3D = FALSE;
293 m_bMouseInWindow = FALSE;
0e320a79 294
a885d89a 295 //
849949b1 296 // wxWnd
a885d89a 297 //
c8b5f745
DW
298 m_hMenu = 0L;
299 m_hWnd = 0L;
300 m_hWndScrollBarHorz = 0L;
301 m_hWndScrollBarVert = 0L;
0e320a79 302
a885d89a
DW
303 //
304 // Pass WM_GETDLGCODE to DefWindowProc()
849949b1 305 m_lDlgCode = 0;
0e320a79 306
776d87d5
DW
307 m_nXThumbSize = 0;
308 m_nYThumbSize = 0;
309 m_bBackgroundTransparent = FALSE;
0e320a79 310
a885d89a
DW
311 //
312 // As all windows are created with WS_VISIBLE style...
313 //
849949b1 314 m_isShown = TRUE;
0e320a79 315
cdf1e714 316#if wxUSE_MOUSEEVENT_HACK
776d87d5
DW
317 m_lLastMouseX =
318 m_lLastMouseY = -1;
319 m_nLastMouseEvent = -1;
cdf1e714 320#endif // wxUSE_MOUSEEVENT_HACK
0367c1c0 321} // wxWindowOS2::Init
0e320a79 322
a885d89a 323//
849949b1 324// Destructor
a885d89a 325//
0367c1c0 326wxWindowOS2::~wxWindowOS2()
0e320a79 327{
849949b1 328 m_isBeingDeleted = TRUE;
0e320a79 329
cdf1e714 330 OS2DetachWindowMenu();
1ec46a5b
DW
331 for (wxWindow* pWin = GetParent(); pWin; pWin = pWin->GetParent())
332 {
333 wxFrame* pFrame = wxDynamicCast(pWin, wxFrame);
334
335 if (pFrame)
336 {
337 if (pFrame->GetLastFocus() == this)
338 pFrame->SetLastFocus((wxWindow*)NULL);
1ec46a5b
DW
339 }
340 }
19193a2c
KB
341
342 DestroyChildren();
343
849949b1
DW
344 if (m_parent)
345 m_parent->RemoveChild(this);
e604d44b 346
849949b1
DW
347 if (m_hWnd)
348 {
a885d89a 349 if(!::WinDestroyWindow(GetHWND()))
223d09f6 350 wxLogLastError(wxT("DestroyWindow"));
a885d89a 351 //
849949b1 352 // remove hWnd <-> wxWindow association
a885d89a 353 //
849949b1
DW
354 wxRemoveHandleAssociation(this);
355 }
0367c1c0 356} // end of wxWindowOS2::~wxWindowOS2
0e320a79 357
19193a2c 358// real construction (Init() must have been called before!)
0367c1c0 359bool wxWindowOS2::Create(
776d87d5
DW
360 wxWindow* pParent
361, wxWindowID vId
362, const wxPoint& rPos
363, const wxSize& rSize
364, long lStyle
365, const wxString& rName
366)
367{
f23208ca 368 HWND hParent = NULLHANDLE;
45bfc84b 369 wxPoint vPos = rPos; // The OS/2 position
19193a2c
KB
370 ULONG ulCreateFlags = 0;
371 WXDWORD dwExStyle = 0;
f23208ca 372
776d87d5
DW
373 wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent"));
374
375 if ( !CreateBase( pParent
376 ,vId
377 ,rPos
378 ,rSize
379 ,lStyle
380 ,wxDefaultValidator
381 ,rName
382 ))
383 return(FALSE);
384
f23208ca
DW
385 if (pParent)
386 {
b7d8f285
DW
387 int nTempy;
388
f23208ca
DW
389 pParent->AddChild(this);
390 hParent = GetWinHwnd(pParent);
cb71578c 391
cb71578c
DW
392 if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
393 pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
394 )
395 ulCreateFlags |= WS_CLIPSIBLINGS;
f23208ca 396 }
776d87d5 397
a885d89a 398 //
f23208ca
DW
399 // Most wxSTYLES are really PM Class specific styles and will be
400 // set in those class create procs. PM's basic windows styles are
401 // very limited.
a885d89a 402 //
51c1d535
DW
403 ulCreateFlags |= WS_VISIBLE;
404
405
19193a2c
KB
406#ifdef __WXUNIVERSAL__
407 // no 3d effects, we draw them ourselves
408 WXDWORD exStyle = 0;
409#else // !wxUniversal
cb71578c 410 if (lStyle & wxCLIP_SIBLINGS)
51c1d535
DW
411 ulCreateFlags |= WS_CLIPSIBLINGS;
412
a885d89a 413 if (lStyle & wxCLIP_CHILDREN )
f23208ca 414 ulCreateFlags |= WS_CLIPCHILDREN;
a885d89a 415
f23208ca 416 //
008089f6 417 //
f23208ca 418 //
776d87d5 419 bool bWant3D;
19193a2c
KB
420 dwExStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &bWant3D);
421
422#endif
008089f6
DW
423
424 //
425 // Add the simple border style as we'll use this to draw borders
426 //
427 if (lStyle & wxSIMPLE_BORDER)
428 dwExStyle |= wxSIMPLE_BORDER;
776d87d5 429
19193a2c
KB
430 if (lStyle & wxPOPUP_WINDOW)
431 {
432 // a popup window floats on top of everything
433//TODO: fix this...
434// exStyle |= WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
435
436 // it is also created hidden as other top level windows
437 ulCreateFlags &= ~WS_VISIBLE;
438 m_isShown = FALSE;
439 }
440
a885d89a 441 //
f23208ca
DW
442 // Generic OS/2 Windows are created with no owner, no Z Order, no Control data,
443 // and no presentation parameters
a885d89a 444 //
f23208ca
DW
445 OS2Create( hParent
446 ,(PSZ)wxCanvasClassName
447 ,rName.c_str()
448 ,ulCreateFlags
45bfc84b
DW
449 ,vPos.x
450 ,vPos.y
776d87d5
DW
451 ,WidthDefault(rSize.x)
452 ,HeightDefault(rSize.y)
f23208ca
DW
453 ,NULLHANDLE
454 ,NULLHANDLE
455 ,m_windowId
008089f6
DW
456 ,NULL
457 ,NULL
458 ,dwExStyle
776d87d5 459 );
e604d44b 460
776d87d5 461 return(TRUE);
0367c1c0 462} // end of wxWindowOS2::Create
0e320a79 463
cdf1e714
DW
464// ---------------------------------------------------------------------------
465// basic operations
466// ---------------------------------------------------------------------------
0e320a79 467
0367c1c0 468void wxWindowOS2::SetFocus()
0e320a79 469{
bbdc9a87 470 HWND hWnd = GetHwnd();
19193a2c 471 wxCHECK_RET( hWnd, _T("can't set focus to invalid window") );
bbdc9a87
DW
472
473 if (hWnd)
474 ::WinSetFocus(HWND_DESKTOP, hWnd);
0367c1c0 475} // end of wxWindowOS2::SetFocus
0e320a79 476
11e59d47 477wxWindow* wxWindowBase::FindFocus()
0e320a79 478{
bbdc9a87
DW
479 HWND hWnd = ::WinQueryFocus(HWND_DESKTOP);
480
481 if (hWnd)
482 {
483 return wxFindWinFromHandle((WXHWND)hWnd);
484 }
485 return NULL;
a885d89a 486} // wxWindowBase::FindFocus
0e320a79 487
0367c1c0 488bool wxWindowOS2::Enable(
bbdc9a87
DW
489 bool bEnable
490)
0e320a79 491{
bbdc9a87
DW
492 if (!wxWindowBase::Enable(bEnable))
493 return(FALSE);
494
495 HWND hWnd = GetHwnd();
496
497 if ( hWnd )
498 ::WinEnableWindow(hWnd, (BOOL)bEnable);
499
500 wxWindowList::Node* pNode = GetChildren().GetFirst();
501
502 while (pNode)
503 {
504 wxWindow* pChild = pNode->GetData();
505
506 pChild->Enable(bEnable);
507 pNode = pNode->GetNext();
508 }
19193a2c 509 return TRUE;
0367c1c0 510} // end of wxWindowOS2::Enable
0e320a79 511
0367c1c0 512bool wxWindowOS2::Show(
bbdc9a87
DW
513 bool bShow
514)
0e320a79 515{
bbdc9a87
DW
516 if (!wxWindowBase::Show(bShow))
517 return(FALSE);
518
519 HWND hWnd = GetHwnd();
520
521 ::WinShowWindow(hWnd, bShow);
522
523 if (bShow)
524 {
a885d89a 525 ::WinSetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE | SWP_ZORDER);
bbdc9a87 526 }
19193a2c 527 return TRUE;
0367c1c0 528} // end of wxWindowOS2::Show
0e320a79 529
0367c1c0 530void wxWindowOS2::Raise()
0e320a79 531{
a885d89a 532 ::WinSetWindowPos(GetHwnd(), HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
0367c1c0 533} // end of wxWindowOS2::Raise
0e320a79 534
0367c1c0 535void wxWindowOS2::Lower()
0e320a79 536{
a885d89a 537 ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER | SWP_DEACTIVATE);
0367c1c0 538} // end of wxWindowOS2::Lower
0e320a79 539
0367c1c0 540void wxWindowOS2::SetTitle(
bbdc9a87
DW
541 const wxString& rTitle
542)
0e320a79 543{
f38374d0 544 ::WinSetWindowText(GetHwnd(), rTitle.c_str());
0367c1c0 545} // end of wxWindowOS2::SetTitle
0e320a79 546
0367c1c0 547wxString wxWindowOS2::GetTitle() const
0e320a79 548{
cdf1e714 549 return wxGetWindowText(GetHWND());
0367c1c0 550} // end of wxWindowOS2::GetTitle
0e320a79 551
0367c1c0 552void wxWindowOS2::CaptureMouse()
0e320a79 553{
f38374d0
DW
554 HWND hWnd = GetHwnd();
555
556 if (hWnd && !m_bWinCaptured)
557 {
558 ::WinSetCapture(HWND_DESKTOP, hWnd);
559 m_bWinCaptured = TRUE;
560 }
0367c1c0 561} // end of wxWindowOS2::GetTitle
0e320a79 562
0367c1c0 563void wxWindowOS2::ReleaseMouse()
0e320a79 564{
a885d89a 565 if (m_bWinCaptured)
f38374d0
DW
566 {
567 ::WinSetCapture(HWND_DESKTOP, NULLHANDLE);
568 m_bWinCaptured = FALSE;
569 }
0367c1c0 570} // end of wxWindowOS2::ReleaseMouse
0e320a79 571
0367c1c0
DW
572/* static */ wxWindow* wxWindowBase::GetCapture()
573{
574 HWND hwnd = ::WinQueryCapture(HWND_DESKTOP);
575 return hwnd ? wxFindWinFromHandle((WXHWND)hwnd) : (wxWindow *)NULL;
576} // end of wxWindowBase::GetCapture
577
578bool wxWindowOS2::SetFont(
f38374d0
DW
579 const wxFont& rFont
580)
0e320a79 581{
f38374d0
DW
582 if (!wxWindowBase::SetFont(rFont))
583 {
584 // nothing to do
585 return(FALSE);
586 }
587
588 HWND hWnd = GetHwnd();
589
590 if (hWnd != 0)
591 {
987da0d4
DW
592 char zFont[128];
593 char zFacename[30];
594 char zWeight[30];
595 char zStyle[30];
596
597 //
598 // The fonts available for Presentation Params are just three
599 // outline fonts, the rest are available to the GPI, so we must
600 // map the families to one of these three
601 //
602 switch(rFont.GetFamily())
603 {
604 case wxSCRIPT:
605 case wxDECORATIVE:
606 case wxROMAN:
607 strcpy(zFacename,"Times New Roman");
608 break;
f38374d0 609
987da0d4
DW
610 case wxTELETYPE:
611 case wxMODERN:
612 strcpy(zFacename, "Courier");
613 break;
614
615 case wxSWISS:
616 case wxDEFAULT:
617 default:
618 strcpy(zFacename, "Helvetica");
619 break;
620 }
621
622 switch(rFont.GetWeight())
623 {
624 default:
625 case wxNORMAL:
626 case wxLIGHT:
627 zWeight[0] = '\0';
628 break;
629
630 case wxBOLD:
631 case wxFONTWEIGHT_MAX:
632 strcpy(zWeight, "Bold");
633 break;
634 }
635 switch(rFont.GetStyle())
636 {
637 case wxITALIC:
638 case wxSLANT:
639 strcpy(zStyle, "Italic");
640 break;
641
642 default:
643 zStyle[0] = '\0';
644 break;
645 }
646 sprintf(zFont, "%d.%s", rFont.GetPointSize(), zFacename);
647 if (zWeight[0] != '\0')
648 {
649 strcat(zFont, " ");
650 strcat(zFont, zWeight);
651 }
652 if (zStyle[0] != '\0')
653 {
654 strcat(zFont, " ");
655 strcat(zFont, zStyle);
656 }
657 ::WinSetPresParam(hWnd, PP_FONTNAMESIZE, strlen(zFont) + 1, (PVOID)zFont);
f38374d0 658 }
cdf1e714 659 return(TRUE);
0e320a79
DW
660}
661
0367c1c0 662bool wxWindowOS2::SetCursor(
f38374d0
DW
663 const wxCursor& rCursor
664) // check if base implementation is OK
0e320a79 665{
f38374d0
DW
666 if ( !wxWindowBase::SetCursor(rCursor))
667 {
668 // no change
669 return FALSE;
670 }
671
19193a2c
KB
672 if ( m_cursor.Ok() ) {
673 HWND hWnd = GetHwnd();
674 POINTL vPoint;
675 RECTL vRect;
f38374d0 676
19193a2c
KB
677 ::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
678 ::WinQueryWindowRect(hWnd, &vRect);
f38374d0 679
19193a2c
KB
680 if (::WinPtInRect(vHabmain, &vRect, &vPoint) && !wxIsBusy())
681 {
682 ::WinSetPointer(HWND_DESKTOP, (HPOINTER)m_cursor.GetHCURSOR());
683 }
f38374d0
DW
684 }
685 return TRUE;
0367c1c0 686} // end of wxWindowOS2::SetCursor
0e320a79 687
0367c1c0 688void wxWindowOS2::WarpPointer(
a885d89a
DW
689 int nXPos
690, int nYPos
691)
0e320a79 692{
a885d89a
DW
693 int nX = nXPos;
694 int nY = nYPos;
695 RECTL vRect;
696
697 ::WinQueryWindowRect(GetHwnd(), &vRect);
698 nX += vRect.xLeft;
699 nY += vRect.yBottom;
700
701 ::WinSetPointerPos(HWND_DESKTOP, (LONG)nX, (LONG)(nY));
0367c1c0 702} // end of wxWindowOS2::WarpPointer
0e320a79 703
cdf1e714 704#if WXWIN_COMPATIBILITY
0367c1c0 705void wxWindowOS2::OS2DeviceToLogical (float *x, float *y) const
0e320a79 706{
0e320a79 707}
cdf1e714 708#endif // WXWIN_COMPATIBILITY
0e320a79 709
cdf1e714
DW
710// ---------------------------------------------------------------------------
711// scrolling stuff
712// ---------------------------------------------------------------------------
0e320a79 713
cdf1e714 714#if WXWIN_COMPATIBILITY
0367c1c0 715void wxWindowOS2::SetScrollRange(
a885d89a
DW
716 int nOrient
717, int nRange
718, bool bRefresh
719)
0e320a79 720{
b7d8f285
DW
721 int nRange1 = nRange;
722 int nPageSize = GetScrollPage(nOrient);
723
724 if (nPpageSize > 1 && nRange > 0)
725 {
726 nRange1 += (nPageSize - 1);
727 }
728
729 if (nOrient == wxHORIZONTAL)
730 {
731 ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
732 ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
733 }
734 else
735 {
736 ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
737 ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
738 }
0367c1c0 739} // end of wxWindowOS2::SetScrollRange
0e320a79 740
0367c1c0 741void wxWindowOS2::SetScrollPage(
a885d89a
DW
742 int nOrient
743, int nPage
744, bool bRefresh
745)
0e320a79 746{
b7d8f285
DW
747 if (nOrient == wxHORIZONTAL )
748 m_nXThumbSize = nPage;
a885d89a 749 else
b7d8f285 750 m_nYThumbSize = nPage;
0367c1c0 751} // end of wxWindowOS2::SetScrollPage
0e320a79 752
0367c1c0 753int wxWindowOS2::OldGetScrollRange(
a885d89a
DW
754 int nOrient
755) const
0e320a79 756{
a885d89a
DW
757 MRESULT mRc;
758 HWND hWnd = GetHwnd();
0e320a79 759
a885d89a
DW
760 if (hWnd)
761 {
762 mRc = WinSendMsg(hWnd, SBM_QUERYRANGE, (MPARAM)0L, (MPARAM)0L);
763 return(SHORT2FROMMR(mRc));
764 }
765 return 0;
0367c1c0 766} // end of wxWindowOS2::OldGetScrollRange
a885d89a 767
0367c1c0 768int wxWindowOS2::GetScrollPage(
a885d89a
DW
769 int nOrient
770) const
0e320a79 771{
a885d89a 772 if (nOrient == wxHORIZONTAL)
05fc6c0a 773 return m_nXThumbSize;
a885d89a 774 else
05fc6c0a 775 return m_nYThumbSize;
0367c1c0 776} // end of wxWindowOS2::GetScrollPage
11e59d47 777#endif // WXWIN_COMPATIBILITY
0e320a79 778
0367c1c0 779int wxWindowOS2::GetScrollPos(
05fc6c0a
DW
780 int nOrient
781) const
0e320a79 782{
b7d8f285
DW
783 if (nOrient == wxHORIZONTAL)
784 return((int)::WinSendMsg(m_hWndScrollBarHorz, SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL));
785 else
786 return((int)::WinSendMsg(m_hWndScrollBarVert, SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL));
0367c1c0 787} // end of wxWindowOS2::GetScrollPos
0e320a79 788
0367c1c0 789int wxWindowOS2::GetScrollRange(
05fc6c0a
DW
790 int nOrient
791) const
0e320a79 792{
05fc6c0a 793 MRESULT mr;
0e320a79 794
b7d8f285
DW
795 if (nOrient == wxHORIZONTAL)
796 mr = ::WinSendMsg(m_hWndScrollBarHorz, SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL);
797 else
798 mr = ::WinSendMsg(m_hWndScrollBarVert, SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL);
05fc6c0a 799 return((int)SHORT2FROMMR(mr));
0367c1c0 800} // end of wxWindowOS2::GetScrollRange
05fc6c0a 801
0367c1c0 802int wxWindowOS2::GetScrollThumb(
05fc6c0a
DW
803 int nOrient
804) const
0e320a79 805{
b7d8f285
DW
806 if (nOrient == wxHORIZONTAL )
807 return m_nXThumbSize;
808 else
809 return m_nYThumbSize;
0367c1c0 810} // end of wxWindowOS2::GetScrollThumb
0e320a79 811
0367c1c0 812void wxWindowOS2::SetScrollPos(
05fc6c0a
DW
813 int nOrient
814, int nPos
19193a2c 815, bool WXUNUSED(bRefresh)
05fc6c0a 816)
0e320a79 817{
b7d8f285
DW
818 if (nOrient == wxHORIZONTAL )
819 ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL);
820 else
821 ::WinSendMsg(m_hWndScrollBarVert, SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL);
19193a2c 822} // end of wxWindowOS2::SetScrollPos
0e320a79 823
0367c1c0 824void wxWindowOS2::SetScrollbar(
05fc6c0a
DW
825 int nOrient
826, int nPos
827, int nThumbVisible
828, int nRange
19193a2c 829, bool WXUNUSED(bRefresh)
05fc6c0a 830)
0e320a79 831{
1c84ee88
DW
832 int nOldRange = nRange - nThumbVisible;
833 int nRange1 = nOldRange;
834 int nPageSize = nThumbVisible;
835 SBCDATA vInfo;
836 HWND hWnd = GetHwnd();
e661fcd7 837 ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT;
1c84ee88
DW
838 RECTL vRect;
839
840 ::WinQueryWindowRect(hWnd, &vRect);
841 if (nPageSize > 1 && nRange > 0)
05fc6c0a 842 {
1c84ee88
DW
843 nRange1 += (nPageSize - 1);
844 }
845
846 vInfo.cb = sizeof(SBCDATA);
847 vInfo.posFirst = 0;
848 vInfo.posLast = (SHORT)nRange1;
849 vInfo.posThumb = nPos;
850
851 if (nOrient == wxHORIZONTAL )
852 {
853 ulStyle |= SBS_HORZ;
c8b5f745 854 if (m_hWndScrollBarHorz == 0L)
1c84ee88 855 {
b7d8f285
DW
856 //
857 // We create the scrollbars with the desktop so that they are not
858 // registered as child windows of the window in order that child
859 // windows may be scrolled without scrolling the scrollbars themselves!
860 //
e661fcd7 861 m_hWndScrollBarHorz = ::WinCreateWindow( hWnd
c8b5f745
DW
862 ,WC_SCROLLBAR
863 ,(PSZ)NULL
864 ,ulStyle
865 ,vRect.xLeft
866 ,vRect.yBottom
867 ,vRect.xRight - vRect.xLeft
868 ,20
869 ,hWnd
870 ,HWND_TOP
b7d8f285 871 ,FID_HORZSCROLL
c8b5f745
DW
872 ,&vInfo
873 ,NULL
874 );
1c84ee88
DW
875 }
876 else
877 {
c8b5f745
DW
878 RECTL vRect2;
879
880 //
881 // Only want to resize the scrollbar if it changes, otherwise
882 // we'd probably end up in a recursive loop until we crash the call stack
883 // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
884 // generates those events.
885 //
886 ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect2);
887 if (!(vRect2.xLeft == vRect.xLeft &&
888 vRect2.xRight == vRect.xRight &&
889 vRect2.yBottom == vRect.yBottom &&
890 vRect2.yTop == vRect.yTop
891 ) )
892 {
893 ::WinSetWindowPos( m_hWndScrollBarHorz
894 ,HWND_TOP
895 ,vRect.xLeft
896 ,vRect.yBottom
897 ,vRect.xRight - vRect.xLeft
898 ,20
899 ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
900 );
901 }
902 ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1));
2be39ac9 903 ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
1c84ee88 904 }
05fc6c0a
DW
905 }
906 else
907 {
1c84ee88 908 ulStyle |= SBS_VERT;
c8b5f745 909 if (m_hWndScrollBarVert == 0L)
1c84ee88 910 {
e661fcd7 911 m_hWndScrollBarVert = ::WinCreateWindow( hWnd
c8b5f745
DW
912 ,WC_SCROLLBAR
913 ,(PSZ)NULL
914 ,ulStyle
915 ,vRect.xRight - 20
833615dd 916 ,vRect.yBottom + 20
c8b5f745 917 ,20
833615dd 918 ,vRect.yTop - (vRect.yBottom + 20)
c8b5f745
DW
919 ,hWnd
920 ,HWND_TOP
b7d8f285 921 ,FID_VERTSCROLL
c8b5f745
DW
922 ,&vInfo
923 ,NULL
924 );
1c84ee88
DW
925 }
926 else
927 {
c8b5f745
DW
928 RECTL vRect2;
929
930 //
931 // Only want to resize the scrollbar if it changes, otherwise
932 // we'd probably end up in a recursive loop until we crash the call stack
933 // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
934 // generates those events.
935 //
936 ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect2);
937 if (!(vRect2.xLeft == vRect.xLeft &&
938 vRect2.xRight == vRect.xRight &&
939 vRect2.yBottom == vRect.yBottom &&
940 vRect2.yTop == vRect.yTop
941 ) )
942 {
943 ::WinSetWindowPos( m_hWndScrollBarVert
944 ,HWND_TOP
945 ,vRect.xRight - 20
833615dd 946 ,vRect.yBottom + 20
c8b5f745 947 ,20
833615dd 948 ,vRect.yTop - (vRect.yBottom + 20)
c8b5f745
DW
949 ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
950 );
951 }
952 ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1));
2be39ac9 953 ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
1c84ee88 954 }
05fc6c0a
DW
955 m_nYThumbSize = nThumbVisible;
956 }
0367c1c0 957} // end of wxWindowOS2::SetScrollbar
0e320a79 958
0367c1c0 959void wxWindowOS2::ScrollWindow(
05fc6c0a
DW
960 int nDx
961, int nDy
962, const wxRect* pRect
963)
0e320a79 964{
b7d8f285 965 RECTL vRect;
05fc6c0a
DW
966 RECTL vRect2;
967
b7d8f285 968 nDy *= -1; // flip the sign of Dy as OS/2 is opposite wxWin.
05fc6c0a
DW
969 if (pRect)
970 {
971 vRect2.xLeft = pRect->x;
b7d8f285 972 vRect2.yTop = pRect->y + pRect->height;
05fc6c0a 973 vRect2.xRight = pRect->x + pRect->width;
b7d8f285 974 vRect2.yBottom = pRect->y;
05fc6c0a 975 }
e661fcd7
DW
976 else
977 {
978 ::WinQueryWindowRect(GetHwnd(), &vRect2);
979 ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect);
980 vRect2.yBottom += vRect.yTop - vRect.yBottom;
981 ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect);
982 vRect2.xRight -= vRect.xRight - vRect.xLeft;
05fc6c0a 983
e661fcd7 984 }
05fc6c0a 985 if (pRect)
b7d8f285
DW
986 ::WinScrollWindow( GetHwnd()
987 ,(LONG)nDx
988 ,(LONG)nDy
989 ,&vRect2
990 ,NULL
991 ,NULLHANDLE
992 ,NULL
e661fcd7 993 ,SW_INVALIDATERGN
b7d8f285 994 );
05fc6c0a 995 else
b7d8f285
DW
996 ::WinScrollWindow( GetHwnd()
997 ,nDx
998 ,nDy
999 ,NULL
1000 ,NULL
1001 ,NULLHANDLE
1002 ,NULL
e661fcd7
DW
1003 ,SW_INVALIDATERGN
1004 );
1005
1006 //
1007 // Move the children
1008 wxWindowList::Node* pCurrent = GetChildren().GetFirst();
1009 SWP vSwp;
1010
1011 while (pCurrent)
1012 {
1013 wxWindow* pChildWin = pCurrent->GetData();
1014
cb71578c
DW
1015 if (pChildWin->GetHWND() != NULLHANDLE)
1016 {
1017 ::WinQueryWindowPos(pChildWin->GetHWND(), &vSwp);
1018 ::WinQueryWindowRect(pChildWin->GetHWND(), &vRect);
1019 if (pChildWin->GetHWND() == m_hWndScrollBarVert ||
1020 pChildWin->GetHWND() == m_hWndScrollBarHorz)
1021 {
1022 ::WinSetWindowPos( pChildWin->GetHWND()
1023 ,HWND_TOP
1024 ,vSwp.x + nDx
1025 ,vSwp.y + nDy
1026 ,0
1027 ,0
1028 ,SWP_MOVE | SWP_SHOW | SWP_ZORDER
1029 );
1030 }
1031 else
1032 {
1033 ::WinSetWindowPos( pChildWin->GetHWND()
1034 ,HWND_BOTTOM
1035 ,vSwp.x + nDx
1036 ,vSwp.y + nDy
1037 ,0
1038 ,0
1039 ,SWP_MOVE | SWP_ZORDER
1040 );
1041 ::WinInvalidateRect(pChildWin->GetHWND(), &vRect, FALSE);
1042 }
1043 }
e661fcd7
DW
1044 pCurrent = pCurrent->GetNext();
1045 }
0367c1c0 1046} // end of wxWindowOS2::ScrollWindow
0e320a79 1047
cdf1e714
DW
1048// ---------------------------------------------------------------------------
1049// subclassing
1050// ---------------------------------------------------------------------------
0e320a79 1051
0367c1c0 1052void wxWindowOS2::SubclassWin(
c86c44a0
DW
1053 WXHWND hWnd
1054)
0e320a79 1055{
05fc6c0a
DW
1056 HWND hwnd = (HWND)hWnd;
1057
776d87d5 1058 wxASSERT_MSG( !m_fnOldWndProc, wxT("subclassing window twice?") );
61243a51 1059 wxCHECK_RET(::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in SubclassWin") );
542875a8 1060 m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(hwnd, (PFNWP)wxWndProc);
0367c1c0 1061} // end of wxWindowOS2::SubclassWin
0e320a79 1062
0367c1c0 1063void wxWindowOS2::UnsubclassWin()
0e320a79 1064{
c86c44a0 1065 //
cdf1e714 1066 // Restore old Window proc
c86c44a0 1067 //
e604d44b 1068 HWND hwnd = GetHWND();
c86c44a0 1069
e604d44b 1070 if (m_hWnd)
cdf1e714 1071 {
61243a51 1072 wxCHECK_RET( ::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in UnsubclassWin") );
0e320a79 1073
e604d44b 1074 PFNWP fnProc = (PFNWP)::WinQueryWindowPtr(hwnd, QWP_PFNWP);
51c1d535 1075
c86c44a0 1076 if ( (m_fnOldWndProc != 0) && (fnProc != (PFNWP) m_fnOldWndProc))
cdf1e714 1077 {
c86c44a0
DW
1078 WinSubclassWindow(hwnd, (PFNWP)m_fnOldWndProc);
1079 m_fnOldWndProc = 0;
cdf1e714
DW
1080 }
1081 }
0367c1c0 1082} // end of wxWindowOS2::UnsubclassWin
0e320a79 1083
05fc6c0a 1084//
cdf1e714 1085// Make a Windows extended style from the given wxWindows window style
05fc6c0a 1086//
0367c1c0 1087WXDWORD wxWindowOS2::MakeExtendedStyle(
05fc6c0a
DW
1088 long lStyle
1089, bool bEliminateBorders
1090)
0e320a79 1091{
05fc6c0a 1092 //
008089f6
DW
1093 // Simply fill out with wxWindow extended styles. We'll conjure
1094 // something up in OS2Create and all window redrawing pieces later
05fc6c0a 1095 //
008089f6
DW
1096 WXDWORD dwStyle = 0;
1097
1098 if (lStyle & wxTRANSPARENT_WINDOW )
1099 dwStyle |= wxTRANSPARENT_WINDOW;
1100
1101 if (!bEliminateBorders)
1102 {
1103 if (lStyle & wxSUNKEN_BORDER)
1104 dwStyle |= wxSUNKEN_BORDER;
1105 if (lStyle & wxDOUBLE_BORDER)
1106 dwStyle |= wxDOUBLE_BORDER;
1107 if (lStyle & wxRAISED_BORDER )
1108 dwStyle |= wxRAISED_BORDER;
1109 if (lStyle & wxSTATIC_BORDER)
1110 dwStyle |= wxSTATIC_BORDER;
1111 }
1112 return dwStyle;
0367c1c0 1113} // end of wxWindowOS2::MakeExtendedStyle
cdf1e714 1114
c86c44a0 1115//
008089f6 1116// Determines whether simulated 3D effects or CTL3D should be used,
cdf1e714 1117// applying a default border style if required, and returning an extended
008089f6 1118// style to pass to OS2Create.
c86c44a0 1119//
0367c1c0 1120WXDWORD wxWindowOS2::Determine3DEffects(
c86c44a0 1121 WXDWORD dwDefaultBorderStyle
542875a8 1122, bool* pbWant3D
c86c44a0
DW
1123) const
1124{
542875a8
DW
1125 WXDWORD dwStyle = 0L;
1126
c86c44a0 1127 //
008089f6
DW
1128 // Native PM does not have any specialize 3D effects like WIN32 does,
1129 // so we have to try and invent them.
1130 //
1131
1132 //
1133 // If matches certain criteria, then assume no 3D effects
1134 // unless specifically requested (dealt with in MakeExtendedStyle)
1135 //
1136 if (!GetParent() ||
1137 !IsKindOf(CLASSINFO(wxControl)) ||
1138 (m_windowStyle & wxNO_BORDER)
1139 )
1140 {
1141 *pbWant3D = FALSE;
1142 return MakeExtendedStyle(m_windowStyle, FALSE);
1143 }
1144
1145 //
1146 // 1) App can specify global 3D effects
c86c44a0 1147 //
008089f6
DW
1148 *pbWant3D = wxTheApp->GetAuto3D();
1149
1150 //
1151 // 2) If the parent is being drawn with user colours, or simple border
1152 // specified, switch effects off.
1153 //
1154 if (GetParent() &&
1155 (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) ||
1156 (m_windowStyle & wxSIMPLE_BORDER)
1157 )
1158 *pbWant3D = FALSE;
1159
1160 //
1161 // 3) Control can override this global setting by defining
1162 // a border style, e.g. wxSUNKEN_BORDER
1163 //
1164 if ((m_windowStyle & wxDOUBLE_BORDER) ||
1165 (m_windowStyle & wxRAISED_BORDER) ||
1166 (m_windowStyle & wxSTATIC_BORDER) ||
1167 (m_windowStyle & wxSUNKEN_BORDER)
1168 )
1169 *pbWant3D = TRUE;
1170
1171 dwStyle = MakeExtendedStyle( m_windowStyle
1172 ,FALSE
1173 );
1174
1175 //
1176 // If we want 3D, but haven't specified a border here,
1177 // apply the default border style specified.
1178 //
1179 if (dwDefaultBorderStyle && (*pbWant3D) &&
1180 !((m_windowStyle & wxDOUBLE_BORDER) ||
1181 (m_windowStyle & wxRAISED_BORDER) ||
1182 (m_windowStyle & wxSTATIC_BORDER) ||
1183 (m_windowStyle & wxSIMPLE_BORDER)
1184 )
1185 )
1186 dwStyle |= dwDefaultBorderStyle;
c86c44a0 1187 return dwStyle;
0367c1c0 1188} // end of wxWindowOS2::Determine3DEffects
cdf1e714
DW
1189
1190#if WXWIN_COMPATIBILITY
0367c1c0 1191void wxWindowOS2::OnCommand(
c86c44a0
DW
1192 wxWindow& rWin
1193, wxCommandEvent& rEvent
1194)
cdf1e714 1195{
c86c44a0
DW
1196 if (GetEventHandler()->ProcessEvent(rEvent))
1197 return;
1198 if (m_parent)
1199 m_parent->GetEventHandler()->OnCommand( rWin
1200 ,rEvent
1201 );
0367c1c0 1202} // end of wxWindowOS2::OnCommand
cdf1e714 1203
0367c1c0 1204wxObject* wxWindowOS2::GetChild(
c86c44a0
DW
1205 int nNumber
1206) const
cdf1e714 1207{
c86c44a0
DW
1208 //
1209 // Return a pointer to the Nth object in the Panel
1210 //
1211 wxNode* pNode = GetChildren().First();
1212 int n = nNumber;
cdf1e714 1213
c86c44a0
DW
1214 while (pNode && n--)
1215 pNode = pNode->Next();
1216 if (pNode)
1217 {
1218 wxObject* pObj = (wxObject*)pNode->Data();
1219 return(pObj);
1220 }
1221 else
1222 return NULL;
0367c1c0 1223} // end of wxWindowOS2::GetChild
cdf1e714
DW
1224
1225#endif // WXWIN_COMPATIBILITY
1226
c86c44a0 1227//
cdf1e714 1228// Setup background and foreground colours correctly
c86c44a0 1229//
0367c1c0 1230void wxWindowOS2::SetupColours()
cdf1e714
DW
1231{
1232 if ( GetParent() )
1233 SetBackgroundColour(GetParent()->GetBackgroundColour());
0367c1c0 1234} // end of wxWindowOS2::SetupColours
cdf1e714 1235
0367c1c0 1236void wxWindowOS2::OnIdle(
19193a2c 1237 wxIdleEvent& WXUNUSED(rEvent)
c86c44a0 1238)
cdf1e714 1239{
c86c44a0
DW
1240 //
1241 // Check if we need to send a LEAVE event
1242 //
1243 if (m_bMouseInWindow)
1244 {
1245 POINTL vPoint;
cdf1e714 1246
c86c44a0
DW
1247 ::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
1248 if (::WinWindowFromPoint(HWND_DESKTOP, &vPoint, FALSE) != (HWND)GetHwnd())
1249 {
1250 //
1251 // Generate a LEAVE event
1252 //
1253 m_bMouseInWindow = FALSE;
1254
1255 //
1256 // Unfortunately the mouse button and keyboard state may have changed
1257 // by the time the OnIdle function is called, so 'state' may be
1258 // meaningless.
1259 //
1260 int nState = 0;
1261
1262 if (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) != 0)
1263 nState |= VK_SHIFT;
542875a8 1264 if (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) != 0);
c86c44a0
DW
1265 nState |= VK_CTRL;
1266
1267 wxMouseEvent rEvent(wxEVT_LEAVE_WINDOW);
1268
1269 InitMouseEvent( rEvent
1270 ,vPoint.x
1271 ,vPoint.y
1272 ,nState
1273 );
542875a8 1274 (void)GetEventHandler()->ProcessEvent(rEvent);
c86c44a0
DW
1275 }
1276 }
1277 UpdateWindowUI();
0367c1c0 1278} // end of wxWindowOS2::OnIdle
c86c44a0
DW
1279
1280//
cdf1e714 1281// Set this window to be the child of 'parent'.
c86c44a0 1282//
0367c1c0 1283bool wxWindowOS2::Reparent(
c86c44a0
DW
1284 wxWindow* pParent
1285)
cdf1e714 1286{
c86c44a0 1287 if (!wxWindowBase::Reparent(pParent))
cdf1e714 1288 return FALSE;
c86c44a0
DW
1289
1290 HWND hWndChild = GetHwnd();
1291 HWND hWndParent = GetParent() ? GetWinHwnd(GetParent()) : (HWND)0;
1292
1293 ::WinSetParent(hWndChild, hWndParent, TRUE);
1294 return TRUE;
0367c1c0 1295} // end of wxWindowOS2::Reparent
cdf1e714 1296
0367c1c0 1297void wxWindowOS2::Clear()
cdf1e714 1298{
19193a2c 1299 wxClientDC vDc((wxWindow*)this);
c86c44a0
DW
1300 wxBrush vBrush( GetBackgroundColour()
1301 ,wxSOLID
1302 );
1303
1304 vDc.SetBackground(vBrush);
1305 vDc.Clear();
0367c1c0 1306} // end of wxWindowOS2::Clear
cdf1e714 1307
0367c1c0 1308void wxWindowOS2::Refresh(
c86c44a0
DW
1309 bool bEraseBack
1310, const wxRect* pRect
1311)
cdf1e714 1312{
c86c44a0
DW
1313 HWND hWnd = GetHwnd();
1314
1315 if (hWnd)
1316 {
1317 if (pRect)
1318 {
1319 RECTL vOs2Rect;
1320
1321 vOs2Rect.xLeft = pRect->x;
542875a8 1322 vOs2Rect.yTop = pRect->y;
c86c44a0
DW
1323 vOs2Rect.xRight = pRect->x + pRect->width;
1324 vOs2Rect.yBottom = pRect->y + pRect->height;
1325
1326 ::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
1327 }
1328 else
1329 ::WinInvalidateRect(hWnd, NULL, bEraseBack);
1330 }
0367c1c0 1331} // end of wxWindowOS2::Refresh
cdf1e714
DW
1332
1333// ---------------------------------------------------------------------------
1334// drag and drop
1335// ---------------------------------------------------------------------------
1336
1337#if wxUSE_DRAG_AND_DROP
0367c1c0 1338void wxWindowOS2::SetDropTarget(
c86c44a0
DW
1339 wxDropTarget* pDropTarget
1340)
cdf1e714 1341{
542875a8 1342 if (m_dropTarget != 0)
c86c44a0
DW
1343 {
1344 m_dropTarget->Revoke(m_hWnd);
1345 delete m_dropTarget;
1346 }
1347 m_dropTarget = pDropTarget;
1348 if (m_dropTarget != 0)
1349 m_dropTarget->Register(m_hWnd);
0367c1c0 1350} // end of wxWindowOS2::SetDropTarget
cdf1e714
DW
1351#endif
1352
c86c44a0 1353//
cdf1e714
DW
1354// old style file-manager drag&drop support: we retain the old-style
1355// DragAcceptFiles in parallel with SetDropTarget.
c86c44a0 1356//
0367c1c0 1357void wxWindowOS2::DragAcceptFiles(
c86c44a0
DW
1358 bool bAccept
1359)
cdf1e714 1360{
c86c44a0
DW
1361 HWND hWnd = GetHwnd();
1362
1363 if (hWnd && bAccept)
542875a8 1364 ::DrgAcceptDroppedFiles(hWnd, NULL, NULL, DO_COPY, 0L);
0367c1c0 1365} // end of wxWindowOS2::DragAcceptFiles
cdf1e714
DW
1366
1367// ----------------------------------------------------------------------------
1368// tooltips
1369// ----------------------------------------------------------------------------
1370
1371#if wxUSE_TOOLTIPS
1372
0367c1c0 1373void wxWindowOS2::DoSetToolTip(
c86c44a0
DW
1374 wxToolTip* pTooltip
1375)
cdf1e714 1376{
c86c44a0 1377 wxWindowBase::DoSetToolTip(pTooltip);
cdf1e714 1378
542875a8 1379 if (m_tooltip)
cdf1e714 1380 m_tooltip->SetWindow(this);
0367c1c0 1381} // end of wxWindowOS2::DoSetToolTip
cdf1e714
DW
1382
1383#endif // wxUSE_TOOLTIPS
1384
1385// ---------------------------------------------------------------------------
1386// moving and resizing
1387// ---------------------------------------------------------------------------
1388
1389// Get total size
0367c1c0 1390void wxWindowOS2::DoGetSize(
a7ef993c
DW
1391 int* pWidth
1392, int* pHeight
1393) const
cdf1e714 1394{
a7ef993c
DW
1395 HWND hWnd = GetHwnd();
1396 RECTL vRect;
c86c44a0 1397
a7ef993c
DW
1398 ::WinQueryWindowRect(hWnd, &vRect);
1399
1400 if (pWidth)
1401 *pWidth = vRect.xRight - vRect.xLeft;
1402 if (pHeight )
1403 // OS/2 PM is backwards from windows
1404 *pHeight = vRect.yTop - vRect.yBottom;
0367c1c0 1405} // end of wxWindowOS2::DoGetSize
cdf1e714 1406
0367c1c0 1407void wxWindowOS2::DoGetPosition(
a7ef993c
DW
1408 int* pX
1409, int* pY
1410) const
cdf1e714 1411{
a7ef993c 1412 HWND hWnd = GetHwnd();
8330166c 1413 SWP vSwp;
a7ef993c 1414 POINTL vPoint;
8330166c 1415 wxWindow* pParent = GetParent();
c86c44a0 1416
8330166c
DW
1417 //
1418 // It would seem that WinQueryWindowRect would be the correlary to
1419 // the WIN32 WinGetRect, but unlike WinGetRect which returns the window
1420 // origin position in screen coordinates, WinQueryWindowRect returns it
1421 // relative to itself, i.e. (0,0). To get the same under PM we must
1422 // us WinQueryWindowPos. This call, unlike the WIN32 call, however,
1423 // returns a position relative to it's parent, so no parent adujstments
1424 // are needed under OS/2. Also, windows should be created using
1425 // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already
1426 // reflect that.
1427 //
1428 ::WinQueryWindowPos(hWnd, &vSwp);
c86c44a0 1429
8330166c
DW
1430 vPoint.x = vSwp.x;
1431 vPoint.y = vSwp.y;
c86c44a0 1432
a7ef993c 1433 //
8330166c
DW
1434 // We may be faking the client origin. So a window that's really at (0,
1435 // 30) may appear (to wxWin apps) to be at (0, 0).
a7ef993c 1436 //
8330166c 1437 if (pParent)
c86c44a0 1438 {
8330166c 1439 wxPoint vPt(pParent->GetClientAreaOrigin());
a7ef993c 1440
8330166c
DW
1441 vPoint.x -= vPt.x;
1442 vPoint.y -= vPt.y;
c86c44a0
DW
1443 }
1444
a7ef993c
DW
1445 if (pX)
1446 *pX = vPoint.x;
542875a8 1447 if (pY)
a7ef993c 1448 *pY = vPoint.y;
0367c1c0 1449} // end of wxWindowOS2::DoGetPosition
cdf1e714 1450
0367c1c0 1451void wxWindowOS2::DoScreenToClient(
a7ef993c
DW
1452 int* pX
1453, int* pY
1454) const
cdf1e714 1455{
a7ef993c 1456 HWND hWnd = GetHwnd();
8330166c 1457 SWP vSwp;
542875a8 1458
8330166c 1459 ::WinQueryWindowPos(hWnd, &vSwp);
cdf1e714 1460
a7ef993c 1461 if (pX)
8330166c 1462 *pX += vSwp.x;
a7ef993c 1463 if (pY)
8330166c 1464 *pY += vSwp.y;
0367c1c0 1465} // end of wxWindowOS2::DoScreenToClient
a7ef993c 1466
0367c1c0 1467void wxWindowOS2::DoClientToScreen(
a7ef993c
DW
1468 int* pX
1469, int* pY
1470) const
cdf1e714 1471{
a7ef993c 1472 HWND hWnd = GetHwnd();
8330166c 1473 SWP vSwp;
19193a2c 1474
8330166c 1475 ::WinQueryWindowPos(hWnd, &vSwp);
c86c44a0 1476
a7ef993c 1477 if (pX)
8330166c 1478 *pX += vSwp.x;
a7ef993c 1479 if (pY)
8330166c 1480 *pY += vSwp.y;
0367c1c0 1481} // end of wxWindowOS2::DoClientToScreen
cdf1e714 1482
a7ef993c 1483//
cdf1e714 1484// Get size *available for subwindows* i.e. excluding menu bar etc.
a7ef993c
DW
1485// Must be a frame type window
1486//
0367c1c0 1487void wxWindowOS2::DoGetClientSize(
a7ef993c
DW
1488 int* pWidth
1489, int* pHeight
1490) const
cdf1e714 1491{
a7ef993c
DW
1492 HWND hWnd = GetHwnd();
1493 HWND hWndClient;
1494 RECTL vRect;
1495
833615dd
DW
1496 if (IsKindOf(CLASSINFO(wxFrame)))
1497 hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
1498 else
1499 hWndClient = NULLHANDLE;
51c1d535
DW
1500 if( hWndClient == NULLHANDLE)
1501 ::WinQueryWindowRect(GetHwnd(), &vRect);
1502 else
1503 ::WinQueryWindowRect(hWndClient, &vRect);
a7ef993c 1504
542875a8 1505 if (pWidth)
a7ef993c 1506 *pWidth = vRect.xRight;
542875a8 1507 if (pHeight)
a7ef993c 1508 *pHeight = vRect.yTop;
0367c1c0 1509} // end of wxWindowOS2::DoGetClientSize
cdf1e714 1510
0367c1c0 1511void wxWindowOS2::DoMoveWindow(
a7ef993c
DW
1512 int nX
1513, int nY
1514, int nWidth
1515, int nHeight
1516)
cdf1e714 1517{
39c26ef2
DW
1518 RECTL vRect;
1519 HWND hParent;
1520 wxWindow* pParent = GetParent();
1521
1522 if (pParent)
987da0d4 1523 {
d8a3f66c
DW
1524 int nOS2Height = GetOS2ParentHeight(pParent);
1525
1526 nY = nOS2Height - (nY + nHeight);
987da0d4 1527 }
39c26ef2 1528 else
c86c44a0 1529 {
987da0d4
DW
1530 RECTL vRect;
1531
1532 ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
1533 nY = vRect.yTop - (nY + nHeight);
1534 }
1535 ::WinSetWindowPos( GetHwnd()
1536 ,HWND_TOP
1537 ,(LONG)nX
1538 ,(LONG)nY
1539 ,(LONG)nWidth
1540 ,(LONG)nHeight
1541 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
1542 );
0367c1c0 1543} // end of wxWindowOS2::DoMoveWindow
cdf1e714 1544
c86c44a0
DW
1545//
1546// Set the size of the window: if the dimensions are positive, just use them,
cdf1e714
DW
1547// but if any of them is equal to -1, it means that we must find the value for
1548// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1549// which case -1 is a valid value for x and y)
1550//
1551// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1552// the width/height to best suit our contents, otherwise we reuse the current
1553// width/height
c86c44a0 1554//
0367c1c0 1555void wxWindowOS2::DoSetSize(
a7ef993c
DW
1556 int nX
1557, int nY
1558, int nWidth
1559, int nHeight
1560, int nSizeFlags
1561)
cdf1e714 1562{
a7ef993c
DW
1563 //
1564 // Get the current size and position...
1565 //
1566 int nCurrentX;
1567 int nCurrentY;
1568 int nCurrentWidth;
1569 int nCurrentHeight;
542875a8 1570 wxSize vSize(-1, -1);
a7ef993c 1571
19193a2c
KB
1572 GetPosition(&nCurrentX, &nCurrentY);
1573 GetSize(&nCurrentWidth, &nCurrentHeight);
c86c44a0
DW
1574
1575 // ... and don't do anything (avoiding flicker) if it's already ok
19193a2c
KB
1576 if (nX == nCurrentX && nY == nCurrentY &&
1577 nWidth == nCurrentWidth && nHeight == nCurrentHeight)
c86c44a0
DW
1578 {
1579 return;
1580 }
1581
a7ef993c
DW
1582 if (nX == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
1583 nX = nCurrentX;
542875a8 1584 if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
a7ef993c 1585 nY = nCurrentY;
c86c44a0 1586
19193a2c 1587 AdjustForParentClientOrigin(nX, nY, nSizeFlags);
c86c44a0 1588
a7ef993c 1589 if (nWidth == -1)
c86c44a0 1590 {
a7ef993c 1591 if (nSizeFlags & wxSIZE_AUTO_WIDTH)
c86c44a0 1592 {
a7ef993c
DW
1593 vSize = DoGetBestSize();
1594 nWidth = vSize.x;
c86c44a0
DW
1595 }
1596 else
1597 {
a7ef993c
DW
1598 //
1599 // Just take the current one
1600 //
1601 nWidth = nCurrentWidth;
c86c44a0
DW
1602 }
1603 }
1604
a7ef993c 1605 if (nHeight == -1)
c86c44a0 1606 {
a7ef993c 1607 if (nSizeFlags & wxSIZE_AUTO_HEIGHT)
c86c44a0 1608 {
a7ef993c 1609 if (vSize.x == -1)
c86c44a0 1610 {
a7ef993c 1611 vSize = DoGetBestSize();
c86c44a0 1612 }
a7ef993c 1613 nHeight = vSize.y;
c86c44a0
DW
1614 }
1615 else
1616 {
1617 // just take the current one
a7ef993c 1618 nHeight = nCurrentHeight;
c86c44a0
DW
1619 }
1620 }
1621
a7ef993c
DW
1622 DoMoveWindow( nX
1623 ,nY
1624 ,nWidth
1625 ,nHeight
1626 );
0367c1c0 1627} // end of wxWindowOS2::DoSetSize
cdf1e714 1628
0367c1c0 1629void wxWindowOS2::DoSetClientSize(
a7ef993c
DW
1630 int nWidth
1631, int nHeight
1632)
cdf1e714 1633{
a7ef993c
DW
1634 wxWindow* pParent = GetParent();
1635 HWND hWnd = GetHwnd();
1636 HWND hParentWnd = (HWND)0;
8330166c 1637 POINTL vPoint;
a7ef993c 1638 RECTL vRect;
8330166c
DW
1639 RECTL vRect2;
1640 RECTL vRect3;
1641 HWND hClientWnd = (HWND)0;
c86c44a0 1642
8330166c 1643 hClientWnd = ::WinWindowFromID(hWnd, FID_CLIENT);
a7ef993c 1644 ::WinQueryWindowRect(hClientWnd, &vRect2);
a7ef993c
DW
1645 ::WinQueryWindowRect(hWnd, &vRect);
1646 ::WinQueryWindowRect(hParentWnd, &vRect3);
8330166c 1647
a7ef993c
DW
1648 int nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth;
1649 int nActualHeight = vRect2.yTop - vRect2.yBottom - vRect.yTop + nHeight;
c86c44a0 1650
a7ef993c
DW
1651 vPoint.x = vRect2.xLeft;
1652 vPoint.y = vRect2.yBottom;
1653 if (pParent)
8330166c 1654 {
a7ef993c 1655 vPoint.x -= vRect3.xLeft;
542875a8 1656 vPoint.y -= vRect3.yBottom;
c86c44a0 1657 }
19193a2c
KB
1658
1659 DoMoveWindow(vPoint.x, vPoint.y, nActualWidth, nActualHeight);
1660
1661 wxSizeEvent vEvent(wxSize(nWidth, nHeight), m_windowId);
a7ef993c
DW
1662 vEvent.SetEventObject(this);
1663 GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 1664} // end of wxWindowOS2::DoSetClientSize
cdf1e714 1665
0367c1c0 1666wxPoint wxWindowOS2::GetClientAreaOrigin() const
cdf1e714
DW
1667{
1668 return wxPoint(0, 0);
0367c1c0 1669} // end of wxWindowOS2::GetClientAreaOrigin
cdf1e714 1670
cdf1e714
DW
1671// ---------------------------------------------------------------------------
1672// text metrics
1673// ---------------------------------------------------------------------------
1674
0367c1c0 1675int wxWindowOS2::GetCharHeight() const
cdf1e714 1676{
a7ef993c
DW
1677 HPS hPs;
1678 FONTMETRICS vFontMetrics;
cdf1e714 1679
a7ef993c
DW
1680 hPs = ::WinGetPS(GetHwnd());
1681
542875a8 1682 if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics))
b7084589
DW
1683 {
1684 ::WinReleasePS(hPs);
a7ef993c 1685 return (0);
b7084589 1686 }
a7ef993c 1687 ::WinReleasePS(hPs);
b7084589 1688 return(vFontMetrics.lMaxAscender + vFontMetrics.lMaxDescender);
0367c1c0 1689} // end of wxWindowOS2::GetCharHeight
a7ef993c 1690
0367c1c0 1691int wxWindowOS2::GetCharWidth() const
cdf1e714 1692{
542875a8
DW
1693 HPS hPs;
1694 FONTMETRICS vFontMetrics;
1695
a7ef993c 1696 hPs = ::WinGetPS(GetHwnd());
cdf1e714 1697
542875a8 1698 if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics))
b7084589
DW
1699 {
1700 ::WinReleasePS(hPs);
a7ef993c 1701 return (0);
b7084589 1702 }
a7ef993c 1703 ::WinReleasePS(hPs);
b7084589 1704 return(vFontMetrics.lAveCharWidth);
0367c1c0 1705} // end of wxWindowOS2::GetCharWidth
a7ef993c 1706
0367c1c0 1707void wxWindowOS2::GetTextExtent(
a7ef993c
DW
1708 const wxString& rString
1709, int* pX
1710, int* pY
1711, int* pDescent
1712, int* pExternalLeading
1713, const wxFont* pTheFont
1714) const
cdf1e714 1715{
987da0d4
DW
1716 POINTL avPoint[TXTBOX_COUNT];
1717 POINTL vPtMin;
1718 POINTL vPtMax;
1719 int i;
1720 int l;
1721 FONTMETRICS vFM; // metrics structure
1722 BOOL bRc;
1723 char* pStr;
1724 ERRORID vErrorCode; // last error id code
1725 HPS hPS;
19193a2c 1726
a7ef993c 1727
987da0d4 1728 hPS = ::WinGetPS(GetHwnd());
a7ef993c 1729
987da0d4
DW
1730 l = rString.Length();
1731 if (l > 0L)
1732 {
1733 pStr = (PCH)rString.c_str();
a7ef993c 1734
987da0d4
DW
1735 //
1736 // In world coordinates.
1737 //
1738 bRc = ::GpiQueryTextBox( hPS
1739 ,l
1740 ,pStr
1741 ,TXTBOX_COUNT // return maximum information
1742 ,avPoint // array of coordinates points
1743 );
1744 if (bRc)
1745 {
1746 vPtMin.x = avPoint[0].x;
1747 vPtMax.x = avPoint[0].x;
1748 vPtMin.y = avPoint[0].y;
1749 vPtMax.y = avPoint[0].y;
1750 for (i = 1; i < 4; i++)
1751 {
1752 if(vPtMin.x > avPoint[i].x) vPtMin.x = avPoint[i].x;
1753 if(vPtMin.y > avPoint[i].y) vPtMin.y = avPoint[i].y;
1754 if(vPtMax.x < avPoint[i].x) vPtMax.x = avPoint[i].x;
1755 if(vPtMax.y < avPoint[i].y) vPtMax.y = avPoint[i].y;
1756 }
1757 bRc = ::GpiQueryFontMetrics( hPS
1758 ,sizeof(FONTMETRICS)
1759 ,&vFM
1760 );
1761 if (!bRc)
1762 {
1763 vPtMin.x = 0;
1764 vPtMin.y = 0;
1765 vPtMax.x = 0;
1766 vPtMax.y = 0;
1767 }
1768 }
1769 else
1770 {
1771 vPtMin.x = 0;
1772 vPtMin.y = 0;
1773 vPtMax.x = 0;
1774 vPtMax.y = 0;
1775 }
1776 }
1777 else
a7ef993c 1778 {
987da0d4
DW
1779 vPtMin.x = 0;
1780 vPtMin.y = 0;
1781 vPtMax.x = 0;
1782 vPtMax.y = 0;
a7ef993c 1783 }
987da0d4
DW
1784 if (pX)
1785 *pX = (vPtMax.x - vPtMin.x + 1);
1786 if (pY)
1787 *pY = (vPtMax.y - vPtMin.y + 1);
1788 if (pDescent)
1789 {
1790 if (bRc)
1791 *pDescent = vFM.lMaxDescender;
1792 else
1793 *pDescent = 0;
1794 }
1795 if (pExternalLeading)
1796 {
1797 if (bRc)
1798 *pExternalLeading = vFM.lExternalLeading;
1799 else
1800 *pExternalLeading = 0;
1801 }
1802 ::WinReleasePS(hPS);
1803} // end of wxWindow::GetTextExtent
cdf1e714
DW
1804
1805#if wxUSE_CARET && WXWIN_COMPATIBILITY
1806// ---------------------------------------------------------------------------
1807// Caret manipulation
1808// ---------------------------------------------------------------------------
1809
0367c1c0 1810void wxWindowOS2::CreateCaret(
a7ef993c
DW
1811 int nWidth
1812, int nHeight
1813)
cdf1e714 1814{
a7ef993c
DW
1815 SetCaret(new wxCaret( this
1816 ,nWidth
1817 ,nHeight
1818 ));
0367c1c0 1819} // end of wxWindowOS2::CreateCaret
a7ef993c 1820
0367c1c0 1821void wxWindowOS2::CreateCaret(
a7ef993c
DW
1822 const wxBitmap* pBitmap
1823)
cdf1e714 1824{
a7ef993c 1825 wxFAIL_MSG("not implemented");
0367c1c0 1826} // end of wxWindowOS2::CreateCaret
cdf1e714 1827
0367c1c0 1828void wxWindowOS2::ShowCaret(
a7ef993c
DW
1829 bool bShow
1830)
cdf1e714 1831{
a7ef993c
DW
1832 wxCHECK_RET( m_caret, "no caret to show" );
1833
1834 m_caret->Show(bShow);
0367c1c0 1835} // end of wxWindowOS2::ShowCaret
cdf1e714 1836
0367c1c0 1837void wxWindowOS2::DestroyCaret()
cdf1e714 1838{
a7ef993c 1839 SetCaret(NULL);
0367c1c0 1840} // end of wxWindowOS2::DestroyCaret
cdf1e714 1841
0367c1c0 1842void wxWindowOS2::SetCaretPos(
a7ef993c
DW
1843 int nX
1844, int nY)
cdf1e714 1845{
a7ef993c
DW
1846 wxCHECK_RET( m_caret, "no caret to move" );
1847
1848 m_caret->Move( nX
1849 ,nY
1850 );
0367c1c0 1851} // end of wxWindowOS2::SetCaretPos
cdf1e714 1852
0367c1c0 1853void wxWindowOS2::GetCaretPos(
a7ef993c
DW
1854 int* pX
1855, int* pY
1856) const
cdf1e714 1857{
a7ef993c
DW
1858 wxCHECK_RET( m_caret, "no caret to get position of" );
1859
1860 m_caret->GetPosition( pX
1861 ,pY
1862 );
0367c1c0 1863} // end of wxWindowOS2::GetCaretPos
cdf1e714
DW
1864
1865#endif //wxUSE_CARET
1866
1867// ---------------------------------------------------------------------------
1868// popup menu
1869// ---------------------------------------------------------------------------
19193a2c
KB
1870//
1871#if wxUSE_MENUS_NATIVE
3febf684
DW
1872static void wxYieldForCommandsOnly()
1873{
1874 //
1875 // Peek all WM_COMMANDs (it will always return WM_QUIT too but we don't
1876 // want to process it here)
1877 //
1878 QMSG vMsg;
1879
19193a2c
KB
1880 while (::WinPeekMsg(vHabmain, &vMsg, (HWND)0, WM_COMMAND,
1881 WM_COMMAND,PM_REMOVE) && vMsg.msg != WM_QUIT)
3febf684
DW
1882 {
1883 wxTheApp->DoMessage((WXMSG*)&vMsg);
1884 }
1885}
19193a2c 1886#endif // wxUSE_MENUS_NATIVE
3febf684 1887
19193a2c 1888#if wxUSE_MENUS_NATIVE
0367c1c0 1889bool wxWindowOS2::DoPopupMenu(
61243a51
DW
1890 wxMenu* pMenu
1891, int nX
1892, int nY
1893)
cdf1e714 1894{
61243a51
DW
1895 HWND hWnd = GetHwnd();
1896 HWND hWndParent = GetParent() ? GetWinHwnd(GetParent()) : (HWND)0;
1897 HWND hMenu = GetHmenuOf(pMenu);
1898
1899 pMenu->SetInvokingWindow(this);
1900 pMenu->UpdateUI();
1901
1902 DoClientToScreen( &nX
1903 ,&nY
1904 );
1905 wxCurrentPopupMenu = pMenu;
1906
1907 ::WinPopupMenu( hWndParent
1908 ,hWnd
1909 ,hMenu
1910 ,nX
1911 ,nY
1912 ,0L
1913 ,PU_MOUSEBUTTON2DOWN | PU_MOUSEBUTTON2 | PU_KEYBOARD
1914 );
3febf684 1915 // we need to do it righ now as otherwise the events are never going to be
19193a2c 1916 // sent to wxCurrentPopupMenu from ;()
3febf684
DW
1917 //
1918 // note that even eliminating (ugly) wxCurrentPopupMenu global wouldn't
1919 // help and we'd still need wxYieldForCommandsOnly() as the menu may be
1920 // destroyed as soon as we return (it can be a local variable in the caller
1921 // for example) and so we do need to process the event immediately
1922 wxYieldForCommandsOnly();
61243a51
DW
1923 wxCurrentPopupMenu = NULL;
1924
1925 pMenu->SetInvokingWindow(NULL);
1926 return TRUE;
0367c1c0 1927} // end of wxWindowOS2::DoPopupMenu
19193a2c 1928#endif // wxUSE_MENUS_NATIVE
cdf1e714
DW
1929
1930// ===========================================================================
1931// pre/post message processing
1932// ===========================================================================
1933
0367c1c0 1934MRESULT wxWindowOS2::OS2DefWindowProc(
61243a51
DW
1935 WXUINT uMsg
1936, WXWPARAM wParam
1937, WXLPARAM lParam
1938)
cdf1e714 1939{
61243a51 1940 if (m_fnOldWndProc)
19193a2c 1941 return (MRESULT)m_fnOldWndProc(GetHWND(), uMsg, (MPARAM)wParam, (MPARAM)lParam);
61243a51 1942 else
19193a2c 1943 return ::WinDefWindowProc(GetHWND(), uMsg, (MPARAM)wParam, (MPARAM)lParam);
0367c1c0 1944} // end of wxWindowOS2::OS2DefWindowProc
cdf1e714 1945
0367c1c0 1946bool wxWindowOS2::OS2ProcessMessage(
61243a51
DW
1947 WXMSG* pMsg
1948)
cdf1e714 1949{
19193a2c
KB
1950// wxUniversal implements tab traversal itself
1951#ifndef __WXUNIVERSAL__
61243a51
DW
1952 QMSG* pQMsg = (QMSG*)pMsg;
1953
1954 if (m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL))
1955 {
1956 //
1957 // Intercept dialog navigation keys
1958 //
1959 bool bProcess = TRUE;
1960 USHORT uKeyFlags = SHORT1FROMMP(pQMsg->mp1);
1961
1962 if (uKeyFlags & KC_KEYUP)
1963 bProcess = FALSE;
1964
1965 if (uKeyFlags & KC_ALT)
1966 bProcess = FALSE;
1967
1968 if (!(uKeyFlags & KC_VIRTUALKEY))
1969 bProcess = FALSE;
1970
1971 if (bProcess)
1972 {
1973 bool bCtrlDown = IsCtrlDown();
1974 bool bShiftDown = IsShiftDown();
1975
1976 //
1977 // WM_QUERYDLGCODE: ask the control if it wants the key for itself,
1978 // don't process it if it's the case (except for Ctrl-Tab/Enter
1979 // combinations which are always processed)
1980 //
1981 ULONG ulDlgCode = 0;
1982
1983 if (!bCtrlDown)
1984 {
1985 ulDlgCode = (ULONG)::WinSendMsg(pQMsg->hwnd, WM_QUERYDLGCODE, pQMsg, 0);
1986 }
1987
1988 bool bForward = TRUE;
1989 bool bWindowChange = FALSE;
1990
1991 switch (SHORT2FROMMP(pQMsg->mp2))
1992 {
1993 //
1994 // Going to make certain assumptions about specific types of controls
1995 // here, so we may have to alter some things later if they prove invalid
1996 //
1997 case VK_TAB:
1998 //
1999 // Shift tabl will always be a nav-key but tabs may be wanted
2000 //
2001 if (!bShiftDown)
2002 {
2003 bProcess = FALSE;
2004 }
2005 else
2006 {
2007 //
2008 // Entry Fields want tabs for themselve usually
2009 //
2010 switch (ulDlgCode)
2011 {
2012 case DLGC_ENTRYFIELD:
2013 case DLGC_MLE:
2014 bProcess = TRUE;
2015 break;
2016
2017 default:
2018 bProcess = FALSE;
2019 }
2020
2021 //
2022 // Ctrl-Tab cycles thru notebook pages
2023 //
2024 bWindowChange = bCtrlDown;
2025 bForward = !bShiftDown;
2026 }
2027 break;
2028
2029 case VK_UP:
2030 case VK_LEFT:
2031 if (bCtrlDown)
2032 bProcess = FALSE;
2033 else
2034 bForward = FALSE;
2035 break;
2036
2037 case VK_DOWN:
2038 case VK_RIGHT:
2039 if (bCtrlDown)
2040 bProcess = FALSE;
2041 break;
2042
2043 case VK_ENTER:
2044 {
2045 if (bCtrlDown)
2046 {
2047 //
2048 // ctrl-enter is not processed
2049 //
2050 return FALSE;
2051 }
2052 else if (ulDlgCode & DLGC_BUTTON)
2053 {
2054 //
2055 // buttons want process Enter themselevs
2056 //
2057 bProcess = FALSE;
2058 }
2059 else
2060 {
1bcfc0e1
DW
2061 wxButton* pBtn = wxDynamicCast( GetDefaultItem()
2062 ,wxButton
2063 );
61243a51
DW
2064
2065 if (pBtn && pBtn->IsEnabled())
2066 {
2067 //
2068 // If we do have a default button, do press it
2069 //
2070 pBtn->OS2Command(BN_CLICKED, 0 /* unused */);
2071 return TRUE;
2072 }
2073 // else: but if it does not it makes sense to make
2074 // it work like a TAB - and that's what we do.
2075 // Note that Ctrl-Enter always works this way.
2076 }
2077 }
2078 break;
2079
2080 default:
2081 bProcess = FALSE;
2082 }
2083
2084 if (bProcess)
2085 {
2086 wxNavigationKeyEvent vEvent;
2087
2088 vEvent.SetDirection(bForward);
2089 vEvent.SetWindowChange(bWindowChange);
2090 vEvent.SetEventObject(this);
2091
2092 if (GetEventHandler()->ProcessEvent(vEvent))
2093 {
2094 wxButton* pBtn = wxDynamicCast(FindFocus(), wxButton);
2095
2096 if (pBtn)
2097 {
2098 //
2099 // The button which has focus should be default
2100 //
2101 pBtn->SetDefault();
2102 }
2103 return TRUE;
2104 }
2105 }
2106 }
dae16775
DW
2107 //
2108 // Let Dialogs process
2109 //
2110 if (::WinSendMsg(pQMsg->hwnd, WM_QUERYDLGCODE, pQMsg, 0));
2111 return TRUE;
61243a51 2112 }
19193a2c
KB
2113#else
2114 pMsg = pMsg; // just shut up the compiler
2115#endif // __WXUNIVERSAL__
61243a51
DW
2116
2117#if wxUSE_TOOLTIPS
2118 if ( m_tooltip )
2119 {
2120 // relay mouse move events to the tooltip control
2121 QMSG* pQMsg = (QMSG*)pMsg;
2122
2123 if (pQMsg->msg == WM_MOUSEMOVE )
2124 m_tooltip->RelayEvent(pMsg);
2125 }
2126#endif // wxUSE_TOOLTIPS
2127
cdf1e714 2128 return FALSE;
0367c1c0 2129} // end of wxWindowOS2::OS2ProcessMessage
cdf1e714 2130
0367c1c0 2131bool wxWindowOS2::OS2TranslateMessage(
61243a51
DW
2132 WXMSG* pMsg
2133)
cdf1e714 2134{
19193a2c 2135#if wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
7e99520b
DW
2136 return m_acceleratorTable.Translate(m_hWnd, pMsg);
2137#else
19193a2c 2138 pMsg = pMsg;
7e99520b
DW
2139 return FALSE;
2140#endif //wxUSE_ACCEL
0367c1c0 2141} // end of wxWindowOS2::OS2TranslateMessage
cdf1e714
DW
2142
2143// ---------------------------------------------------------------------------
61243a51 2144// message params unpackers
cdf1e714
DW
2145// ---------------------------------------------------------------------------
2146
0367c1c0 2147void wxWindowOS2::UnpackCommand(
61243a51
DW
2148 WXWPARAM wParam
2149, WXLPARAM lParam
2150, WORD* pId
2151, WXHWND* phWnd
2152, WORD* pCmd
2153)
cdf1e714 2154{
5b3ed311
DW
2155 *pId = LOWORD(wParam);
2156 *phWnd = NULL; // or may be GetHWND() ?
2157 *pCmd = LOWORD(lParam);
0367c1c0 2158} // end of wxWindowOS2::UnpackCommand
cdf1e714 2159
0367c1c0 2160void wxWindowOS2::UnpackActivate(
61243a51
DW
2161 WXWPARAM wParam
2162, WXLPARAM lParam
2163, WXWORD* pState
2164, WXHWND* phWnd
2165)
cdf1e714 2166{
61243a51
DW
2167 *pState = LOWORD(wParam);
2168 *phWnd = (WXHWND)lParam;
0367c1c0 2169} // end of wxWindowOS2::UnpackActivate
cdf1e714 2170
0367c1c0 2171void wxWindowOS2::UnpackScroll(
61243a51
DW
2172 WXWPARAM wParam
2173, WXLPARAM lParam
2174, WXWORD* pCode
2175, WXWORD* pPos
2176, WXHWND* phWnd
2177)
cdf1e714 2178{
b7d8f285
DW
2179 ULONG ulId;
2180 HWND hWnd;
2181
2182 ulId = (ULONG)LONGFROMMP(wParam);
2183 hWnd = ::WinWindowFromID(GetHwnd(), ulId);
2184 if (hWnd == m_hWndScrollBarHorz || hWnd == m_hWndScrollBarVert)
2185 *phWnd = NULLHANDLE;
2186 else
2187 *phWnd = hWnd;
2188
2189 *pPos = SHORT1FROMMP(lParam);
2190 *pCode = SHORT2FROMMP(lParam);
0367c1c0 2191} // end of wxWindowOS2::UnpackScroll
61243a51 2192
0367c1c0 2193void wxWindowOS2::UnpackMenuSelect(
61243a51
DW
2194 WXWPARAM wParam
2195, WXLPARAM lParam
2196, WXWORD* pItem
2197, WXWORD* pFlags
2198, WXHMENU* phMenu
2199)
cdf1e714 2200{
61243a51
DW
2201 *pItem = (WXWORD)LOWORD(wParam);
2202 *pFlags = HIWORD(wParam);
2203 *phMenu = (WXHMENU)lParam;
0367c1c0 2204} // end of wxWindowOS2::UnpackMenuSelect
cdf1e714
DW
2205
2206// ---------------------------------------------------------------------------
2207// Main wxWindows window proc and the window proc for wxWindow
2208// ---------------------------------------------------------------------------
2209
61243a51 2210//
cdf1e714
DW
2211// Hook for new window just as it's being created, when the window isn't yet
2212// associated with the handle
61243a51 2213//
19193a2c 2214wxWindowOS2* wxWndHook = NULL;
cdf1e714 2215
61243a51 2216//
cdf1e714 2217// Main window proc
61243a51 2218//
f23208ca 2219MRESULT EXPENTRY wxWndProc(
61243a51
DW
2220 HWND hWnd
2221, ULONG ulMsg
2222, MPARAM wParam
2223, MPARAM lParam
2224)
cdf1e714 2225{
61243a51
DW
2226 //
2227 // Trace all ulMsgs - useful for the debugging
2228 //
cdf1e714
DW
2229#ifdef __WXDEBUG__
2230 wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"),
61243a51 2231 wxGetMessageName(ulMsg), wParam, lParam);
cdf1e714
DW
2232#endif // __WXDEBUG__
2233
19193a2c 2234 wxWindowOS2* pWnd = wxFindWinFromHandle((WXHWND)hWnd);
cdf1e714 2235
61243a51
DW
2236 //
2237 // When we get the first message for the HWND we just created, we associate
cdf1e714 2238 // it with wxWindow stored in wxWndHook
61243a51
DW
2239 //
2240 if (!pWnd && wxWndHook)
cdf1e714 2241 {
cdf1e714 2242 wxAssociateWinWithHandle(hWnd, wxWndHook);
61243a51 2243 pWnd = wxWndHook;
cdf1e714 2244 wxWndHook = NULL;
61243a51 2245 pWnd->SetHWND((WXHWND)hWnd);
cdf1e714
DW
2246 }
2247
5b3ed311 2248 MRESULT rc = (MRESULT)0;
e604d44b 2249
cdf1e714 2250
61243a51 2251 //
cdf1e714 2252 // Stop right here if we don't have a valid handle in our wxWindow object.
61243a51
DW
2253 //
2254 if (pWnd && !pWnd->GetHWND())
cdf1e714 2255 {
61243a51
DW
2256 pWnd->SetHWND((WXHWND) hWnd);
2257 rc = pWnd->OS2DefWindowProc(ulMsg, wParam, lParam );
2258 pWnd->SetHWND(0);
cdf1e714
DW
2259 }
2260 else
2261 {
61243a51
DW
2262 if (pWnd)
2263 rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam);
e604d44b 2264 else
61243a51 2265 rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
cdf1e714 2266 }
5b3ed311 2267
cdf1e714 2268 return rc;
61243a51 2269} // end of wxWndProc
cdf1e714 2270
61243a51
DW
2271//
2272// We will add (or delete) messages we need to handle at this default
2273// level as we go
2274//
0367c1c0 2275MRESULT wxWindowOS2::OS2WindowProc(
61243a51
DW
2276 WXUINT uMsg
2277, WXWPARAM wParam
2278, WXLPARAM lParam
2279)
cdf1e714 2280{
61243a51
DW
2281 //
2282 // Did we process the uMsg?
2283 //
2284 bool bProcessed = FALSE;
e604d44b 2285 MRESULT mResult;
cdf1e714 2286
61243a51
DW
2287 //
2288 // For most messages we should return 0 when we do process the message
2289 //
e604d44b 2290 mResult = (MRESULT)0;
61243a51
DW
2291
2292 switch (uMsg)
cdf1e714
DW
2293 {
2294 case WM_CREATE:
2295 {
61243a51
DW
2296 bool bMayCreate;
2297
2298 bProcessed = HandleCreate( (WXLPCREATESTRUCT)lParam
2299 ,&bMayCreate
2300 );
2301 if (bProcessed)
cdf1e714 2302 {
61243a51
DW
2303 //
2304 // Return 0 to bAllow window creation
2305 //
e604d44b 2306 mResult = (MRESULT)(bMayCreate ? 0 : -1);
cdf1e714
DW
2307 }
2308 }
2309 break;
2310
2311 case WM_DESTROY:
e604d44b
DW
2312 HandleDestroy();
2313 bProcessed = TRUE;
e604d44b 2314 break;
cdf1e714
DW
2315
2316 case WM_MOVE:
61243a51
DW
2317 bProcessed = HandleMove( LOWORD(lParam)
2318 ,HIWORD(lParam)
2319 );
cdf1e714
DW
2320 break;
2321
2322 case WM_SIZE:
61243a51
DW
2323 bProcessed = HandleSize( LOWORD(lParam)
2324 ,HIWORD(lParam)
2325 ,(WXUINT)wParam
2326 );
cdf1e714
DW
2327 break;
2328
2329 case WM_ACTIVATE:
2330 {
61243a51
DW
2331 WXWORD wState;
2332 WXHWND hWnd;
2333
2334 UnpackActivate( wParam
2335 ,lParam
2336 ,&wState
2337 ,&hWnd
2338 );
2339
2340 bProcessed = HandleActivate( wState
2341 ,(WXHWND)hWnd
2342 );
e604d44b 2343 bProcessed = FALSE;
cdf1e714
DW
2344 }
2345 break;
2346
2347 case WM_SETFOCUS:
61243a51
DW
2348 if (SHORT1FROMMP((MPARAM)lParam) == TRUE)
2349 bProcessed = HandleSetFocus((WXHWND)(HWND)wParam);
2350 else
2351 bProcessed = HandleKillFocus((WXHWND)(HWND)wParam);
cdf1e714
DW
2352 break;
2353
2354 case WM_PAINT:
61243a51 2355 bProcessed = HandlePaint();
cdf1e714
DW
2356 break;
2357
2358 case WM_CLOSE:
61243a51
DW
2359 //
2360 // Don't let the DefWindowProc() destroy our window - we'll do it
cdf1e714 2361 // ourselves in ~wxWindow
61243a51
DW
2362 //
2363 bProcessed = TRUE;
e604d44b 2364 mResult = (MRESULT)TRUE;
cdf1e714
DW
2365 break;
2366
61243a51
DW
2367 case WM_SHOW:
2368 bProcessed = HandleShow(wParam != 0, (int)lParam);
cdf1e714
DW
2369 break;
2370
61243a51
DW
2371 //
2372 // Under OS2 PM Joysticks are treated just like mouse events
2373 // The "Motion" events will be prevelent in joysticks
2374 //
cdf1e714 2375 case WM_MOUSEMOVE:
61243a51
DW
2376 case WM_BUTTON1DOWN:
2377 case WM_BUTTON1UP:
2378 case WM_BUTTON1DBLCLK:
2379 case WM_BUTTON1MOTIONEND:
2380 case WM_BUTTON1MOTIONSTART:
2381 case WM_BUTTON2DOWN:
2382 case WM_BUTTON2UP:
2383 case WM_BUTTON2DBLCLK:
2384 case WM_BUTTON2MOTIONEND:
2385 case WM_BUTTON2MOTIONSTART:
2386 case WM_BUTTON3DOWN:
2387 case WM_BUTTON3UP:
2388 case WM_BUTTON3DBLCLK:
2389 case WM_BUTTON3MOTIONEND:
2390 case WM_BUTTON3MOTIONSTART:
cdf1e714
DW
2391 {
2392 short x = LOWORD(lParam);
2393 short y = HIWORD(lParam);
2394
61243a51 2395 bProcessed = HandleMouseEvent(uMsg, x, y, (WXUINT)wParam);
cdf1e714
DW
2396 }
2397 break;
cdf1e714 2398 case WM_SYSCOMMAND:
61243a51 2399 bProcessed = HandleSysCommand(wParam, lParam);
cdf1e714
DW
2400 break;
2401
2402 case WM_COMMAND:
2403 {
2404 WORD id, cmd;
2405 WXHWND hwnd;
2406 UnpackCommand(wParam, lParam, &id, &hwnd, &cmd);
2407
61243a51 2408 bProcessed = HandleCommand(id, cmd, hwnd);
cdf1e714
DW
2409 }
2410 break;
2411
61243a51
DW
2412 //
2413 // For these messages we must return TRUE if process the message
2414 //
cdf1e714
DW
2415 case WM_DRAWITEM:
2416 case WM_MEASUREITEM:
2417 {
45bedfdd 2418 int nIdCtrl = (UINT)wParam;
45bedfdd 2419
61243a51 2420 if ( uMsg == WM_DRAWITEM )
cdf1e714 2421 {
45bedfdd 2422 bProcessed = OS2OnDrawItem(nIdCtrl,
cdf1e714
DW
2423 (WXDRAWITEMSTRUCT *)lParam);
2424 }
2425 else
2426 {
45bedfdd 2427 bProcessed = OS2OnMeasureItem(nIdCtrl,
cdf1e714
DW
2428 (WXMEASUREITEMSTRUCT *)lParam);
2429 }
2430
61243a51 2431 if ( bProcessed )
e604d44b 2432 mResult = (MRESULT)TRUE;
cdf1e714
DW
2433 }
2434 break;
2435
61243a51 2436 case WM_QUERYDLGCODE:
cdf1e714
DW
2437 if ( m_lDlgCode )
2438 {
e604d44b 2439 mResult = (MRESULT)m_lDlgCode;
61243a51 2440 bProcessed = TRUE;
cdf1e714 2441 }
61243a51 2442 //
cdf1e714 2443 //else: get the dlg code from the DefWindowProc()
61243a51 2444 //
cdf1e714
DW
2445 break;
2446
61243a51
DW
2447 //
2448 // In OS/2 PM all keyboard events are of the WM_CHAR type. Virtual key and key-up
2449 // and key-down events are obtained from the WM_CHAR params.
2450 //
2451 case WM_CHAR:
cdf1e714 2452 {
61243a51 2453 USHORT uKeyFlags = SHORT1FROMMP((MPARAM)wParam);
cdf1e714 2454
61243a51
DW
2455 if (uKeyFlags & KC_KEYUP)
2456 {
19193a2c 2457 //TODO: check if the cast to WXWORD isn't causing trouble
987da0d4 2458 bProcessed = HandleKeyUp((WXDWORD)wParam, lParam);
cdf1e714 2459 break;
61243a51
DW
2460 }
2461 else // keydown event
2462 {
2463 //
2464 // If this has been processed by an event handler,
2465 // return 0 now (we've handled it). DON't RETURN
2466 // we still need to process further
2467 //
987da0d4 2468 HandleKeyDown((WXDWORD)wParam, lParam);
61243a51 2469 if (uKeyFlags & KC_VIRTUALKEY)
cdf1e714 2470 {
61243a51
DW
2471 USHORT uVk = SHORT2FROMMP((MPARAM)lParam);
2472
2473 //
2474 // We consider these message "not interesting" to OnChar
2475 //
2476 if (uVk == VK_SHIFT || uVk == VK_CTRL )
2477 {
2478 bProcessed = TRUE;
2479 break;
2480 }
2481 switch(uVk)
2482 {
2483 //
2484 // Avoid duplicate messages to OnChar for these ASCII keys: they
2485 // will be translated by TranslateMessage() and received in WM_CHAR
2486 case VK_ESC:
2487 case VK_SPACE:
2488 case VK_ENTER:
2489 case VK_BACKSPACE:
2490 case VK_TAB:
2491 // But set processed to FALSE, not TRUE to still pass them to
2492 // the control's default window proc - otherwise built-in
2493 // keyboard handling won't work
2494 bProcessed = FALSE;
2495 break;
2496
2497 case VK_LEFT:
2498 case VK_RIGHT:
2499 case VK_DOWN:
2500 case VK_UP:
2501 default:
987da0d4 2502 bProcessed = HandleChar((WXDWORD)wParam, lParam);
61243a51
DW
2503 }
2504 break;
cdf1e714 2505 }
61243a51
DW
2506 else // WM_CHAR -- Always an ASCII character
2507 {
987da0d4 2508 bProcessed = HandleChar((WXDWORD)wParam, lParam, TRUE);
61243a51
DW
2509 break;
2510 }
2511 }
cdf1e714 2512 }
cdf1e714
DW
2513
2514 case WM_HSCROLL:
2515 case WM_VSCROLL:
2516 {
61243a51
DW
2517 WXWORD wCode;
2518 WXWORD wPos;
2519 WXHWND hWnd;
2520 UnpackScroll( wParam
2521 ,lParam
2522 ,&wCode
2523 ,&wPos
2524 ,&hWnd
2525 );
2526
2527 bProcessed = OS2OnScroll( uMsg == WM_HSCROLL ? wxHORIZONTAL
2528 : wxVERTICAL
2529 ,wCode
2530 ,wPos
2531 ,hWnd
2532 );
cdf1e714
DW
2533 }
2534 break;
2535
3c299c3a
DW
2536 case WM_CONTROL:
2537 switch(SHORT2FROMMP(wParam))
2538 {
2539 case SPBN_UPARROW:
2540 case SPBN_DOWNARROW:
2541 case SPBN_CHANGE:
2542 {
2543 char zVal[10];
2544 long lVal;
2545
2546 ::WinSendMsg( HWNDFROMMP(lParam)
2547 ,SPBM_QUERYVALUE
2548 ,&zVal
2549 ,MPFROM2SHORT( (USHORT)10
2550 ,(USHORT)SPBQ_UPDATEIFVALID
2551 )
2552 );
2553 lVal = atol(zVal);
2554 bProcessed = OS2OnScroll( wxVERTICAL
2555 ,(int)SHORT2FROMMP(wParam)
2556 ,(int)lVal
2557 ,HWNDFROMMP(lParam)
2558 );
2559 }
2560 break;
2561
2562 case SLN_SLIDERTRACK:
2563 {
2564 HWND hWnd = ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam));
2565 wxWindowOS2* pChild = wxFindWinFromHandle(hWnd);
2566
2567 if (pChild->IsKindOf(CLASSINFO(wxSlider)))
2568 bProcessed = OS2OnScroll( wxVERTICAL
2569 ,(int)SHORT2FROMMP(wParam)
2570 ,(int)LONGFROMMP(lParam)
2571 ,hWnd
2572 );
2573 }
2574 break;
2575 }
2576 break;
2577
61243a51
DW
2578#if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
2579 case WM_CTLCOLORCHANGE:
cdf1e714 2580 {
e604d44b 2581 bProcessed = HandleCtlColor(&hBrush);
61243a51
DW
2582 }
2583 break;
2584#endif
8d854fa9
DW
2585 case WM_ERASEBACKGROUND:
2586 //
2587 // Returning TRUE to requestw PM to paint the window background
2588 // in SYSCLR_WINDOW. We don't really want that
2589 //
2590 bProcessed = HandleEraseBkgnd((WXHDC)(HPS)wParam);
2591 mResult = (MRESULT)(FALSE);
2592 break;
2593
cdf1e714
DW
2594 // the return value for this message is ignored
2595 case WM_SYSCOLORCHANGE:
61243a51 2596 bProcessed = HandleSysColorChange();
cdf1e714
DW
2597 break;
2598
61243a51
DW
2599 case WM_REALIZEPALETTE:
2600 bProcessed = HandlePaletteChanged();
cdf1e714
DW
2601 break;
2602
61243a51
DW
2603 // move all drag and drops to wxDrg
2604 case WM_ENDDRAG:
2605 bProcessed = HandleEndDrag(wParam);
cdf1e714
DW
2606 break;
2607
61243a51
DW
2608 case WM_INITDLG:
2609 bProcessed = HandleInitDialog((WXHWND)(HWND)wParam);
cdf1e714 2610
61243a51 2611 if ( bProcessed )
cdf1e714
DW
2612 {
2613 // we never set focus from here
e604d44b 2614 mResult = FALSE;
cdf1e714
DW
2615 }
2616 break;
2617
61243a51
DW
2618 // wxFrame specific message
2619 case WM_MINMAXFRAME:
f6bcfd97 2620 bProcessed = HandleGetMinMaxInfo((PSWP)wParam);
cdf1e714
DW
2621 break;
2622
61243a51
DW
2623 case WM_SYSVALUECHANGED:
2624 // TODO: do something
e604d44b 2625 mResult = (MRESULT)TRUE;
cdf1e714
DW
2626 break;
2627
61243a51
DW
2628 //
2629 // Comparable to WM_SETPOINTER for windows, only for just controls
2630 //
2631 case WM_CONTROLPOINTER:
2632 bProcessed = HandleSetCursor( SHORT1FROMMP(wParam) // Control ID
2633 ,(HWND)lParam // Cursor Handle
2634 );
2635 if (bProcessed )
cdf1e714 2636 {
61243a51
DW
2637 //
2638 // Returning TRUE stops the DefWindowProc() from further
cdf1e714
DW
2639 // processing this message - exactly what we need because we've
2640 // just set the cursor.
61243a51 2641 //
e604d44b 2642 mResult = (MRESULT)TRUE;
cdf1e714
DW
2643 }
2644 break;
2645 }
61243a51 2646 if (!bProcessed)
cdf1e714
DW
2647 {
2648#ifdef __WXDEBUG__
2649 wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."),
61243a51 2650 wxGetMessageName(uMsg));
cdf1e714 2651#endif // __WXDEBUG__
d08f23a7
DW
2652 if (IsKindOf(CLASSINFO(wxFrame)))
2653 mResult = ::WinDefWindowProc(m_hWnd, uMsg, wParam, lParam);
2654 else
2655 mResult = OS2DefWindowProc(uMsg, wParam, lParam);
cdf1e714 2656 }
e604d44b 2657 return mResult;
0367c1c0 2658} // end of wxWindowOS2::OS2WindowProc
cdf1e714 2659
61243a51 2660//
cdf1e714 2661// Dialog window proc
61243a51
DW
2662//
2663MRESULT wxDlgProc(
19193a2c 2664 HWND WXUNUSED(hWnd)
61243a51 2665, UINT uMsg
19193a2c
KB
2666, MPARAM WXUNUSED(wParam)
2667, MPARAM WXUNUSED(lParam))
cdf1e714 2668{
61243a51 2669 if (uMsg == WM_INITDLG)
cdf1e714 2670 {
61243a51
DW
2671 //
2672 // For this message, returning TRUE tells system to set focus to the
cdf1e714 2673 // first control in the dialog box
61243a51
DW
2674 //
2675 return (MRESULT)TRUE;
cdf1e714
DW
2676 }
2677 else
2678 {
61243a51
DW
2679 //
2680 // For all the other ones, FALSE means that we didn't process the
cdf1e714 2681 // message
61243a51
DW
2682 //
2683 return (MRESULT)0;
cdf1e714 2684 }
61243a51 2685} // end of wxDlgProc
cdf1e714 2686
61243a51
DW
2687wxWindow* wxFindWinFromHandle(
2688 WXHWND hWnd
2689)
cdf1e714 2690{
61243a51
DW
2691 wxNode* pNode = wxWinHandleList->Find((long)hWnd);
2692
2693 if (!pNode)
cdf1e714 2694 return NULL;
61243a51
DW
2695 return (wxWindow *)pNode->Data();
2696} // end of wxFindWinFromHandle
cdf1e714 2697
61243a51
DW
2698void wxAssociateWinWithHandle(
2699 HWND hWnd
19193a2c 2700, wxWindowOS2* pWin
61243a51 2701)
cdf1e714 2702{
61243a51
DW
2703 //
2704 // Adding NULL hWnd is (first) surely a result of an error and
cdf1e714 2705 // (secondly) breaks menu command processing
61243a51 2706 //
cdf1e714
DW
2707 wxCHECK_RET( hWnd != (HWND)NULL,
2708 wxT("attempt to add a NULL hWnd to window list ignored") );
2709
2710
61243a51
DW
2711 wxWindow* pOldWin = wxFindWinFromHandle((WXHWND) hWnd);
2712
2713 if (pOldWin && (pOldWin != pWin))
cdf1e714 2714 {
61243a51
DW
2715 wxString str(pWin->GetClassInfo()->GetClassName());
2716 wxLogError( "Bug! Found existing HWND %X for new window of class %s"
2717 ,(int)hWnd
2718 ,(const char*)str
2719 );
cdf1e714 2720 }
61243a51 2721 else if (!pOldWin)
cdf1e714 2722 {
61243a51
DW
2723 wxWinHandleList->Append( (long)hWnd
2724 ,pWin
2725 );
cdf1e714 2726 }
61243a51 2727} // end of wxAssociateWinWithHandle
cdf1e714 2728
61243a51 2729void wxRemoveHandleAssociation(
19193a2c 2730 wxWindowOS2* pWin
61243a51 2731)
cdf1e714 2732{
61243a51
DW
2733 wxWinHandleList->DeleteObject(pWin);
2734} // end of wxRemoveHandleAssociation
cdf1e714 2735
61243a51 2736//
cdf1e714
DW
2737// Default destroyer - override if you destroy it in some other way
2738// (e.g. with MDI child windows)
61243a51 2739//
0367c1c0 2740void wxWindowOS2::OS2DestroyWindow()
cdf1e714
DW
2741{
2742}
2743
0367c1c0 2744void wxWindowOS2::OS2DetachWindowMenu()
cdf1e714 2745{
19193a2c 2746#ifndef __WXUNIVERSAL__
61243a51 2747 if (m_hMenu)
cdf1e714 2748 {
61243a51 2749 HMENU hMenu = (HMENU)m_hMenu;
cdf1e714 2750
61243a51
DW
2751 int nN = (int)::WinSendMsg(hMenu, MM_QUERYITEMCOUNT, 0, 0);
2752 int i;
2753
2754 for (i = 0; i < nN; i++)
cdf1e714 2755 {
61243a51
DW
2756 wxChar zBuf[100];
2757 int nChars = (int)::WinSendMsg( hMenu
2758 ,MM_QUERYITEMTEXT
2759 ,MPFROM2SHORT(i, nN)
2760 ,zBuf
2761 );
2762 if (!nChars)
cdf1e714
DW
2763 {
2764 wxLogLastError(wxT("GetMenuString"));
cdf1e714
DW
2765 continue;
2766 }
2767
61243a51 2768 if (wxStrcmp(zBuf, wxT("&Window")) == 0)
cdf1e714 2769 {
61243a51 2770 ::WinSendMsg(hMenu, MM_DELETEITEM, MPFROM2SHORT(i, TRUE), 0);
cdf1e714
DW
2771 break;
2772 }
2773 }
2774 }
19193a2c 2775#endif // __WXUNIVERSAL__
0367c1c0 2776} // end of wxWindowOS2::OS2DetachWindowMenu
cdf1e714 2777
0367c1c0 2778bool wxWindowOS2::OS2Create(
f23208ca
DW
2779 WXHWND hParent
2780, PSZ zClass
61243a51 2781, const wxChar* zTitle
61243a51 2782, WXDWORD dwStyle
f23208ca
DW
2783, long lX
2784, long lY
2785, long lWidth
2786, long lHeight
2787, WXHWND hOwner
19193a2c 2788, WXHWND WXUNUSED(hZOrder)
f23208ca
DW
2789, unsigned long ulId
2790, void* pCtlData
2791, void* pPresParams
008089f6 2792, WXDWORD dwExStyle
61243a51
DW
2793)
2794{
914589c2
DW
2795 ERRORID vError;
2796 wxString sError;
5b3ed311 2797 long lX1 = 0L;
f23208ca 2798 long lY1 = 0L;
5b3ed311
DW
2799 long lWidth1 = 20L;
2800 long lHeight1 = 20L;
f23208ca 2801 int nControlId = 0;
51c1d535
DW
2802 int nNeedsubclass = 0;
2803 PCSZ pszClass = zClass;
cdf1e714 2804
61243a51 2805 //
cdf1e714
DW
2806 // Find parent's size, if it exists, to set up a possible default
2807 // panel size the size of the parent window
61243a51 2808 //
cb71578c
DW
2809 lX1 = lX;
2810 lY1 = lY;
f23208ca
DW
2811 if (lWidth > -1L)
2812 lWidth1 = lWidth;
2813 if (lHeight > -1L)
2814 lHeight1 = lHeight;
cdf1e714
DW
2815
2816 wxWndHook = this;
2817
f23208ca
DW
2818 //
2819 // check to see if the new window is a standard control
2820 //
2821 if ((ULONG)zClass == (ULONG)WC_BUTTON ||
2822 (ULONG)zClass == (ULONG)WC_COMBOBOX ||
2823 (ULONG)zClass == (ULONG)WC_CONTAINER ||
2824 (ULONG)zClass == (ULONG)WC_ENTRYFIELD ||
40bd6154 2825 (ULONG)zClass == (ULONG)WC_FRAME ||
f23208ca
DW
2826 (ULONG)zClass == (ULONG)WC_LISTBOX ||
2827 (ULONG)zClass == (ULONG)WC_MENU ||
2828 (ULONG)zClass == (ULONG)WC_NOTEBOOK ||
2829 (ULONG)zClass == (ULONG)WC_SCROLLBAR ||
2830 (ULONG)zClass == (ULONG)WC_SPINBUTTON ||
2831 (ULONG)zClass == (ULONG)WC_STATIC ||
2832 (ULONG)zClass == (ULONG)WC_TITLEBAR ||
2833 (ULONG)zClass == (ULONG)WC_VALUESET
2834 )
cdf1e714 2835 {
f23208ca 2836 nControlId = ulId;
cdf1e714 2837 }
51c1d535
DW
2838 else
2839 {
2840 // no standard controls
2841 if(wxString (wxT("wxFrameClass")) == wxString(zClass) )
2842 {
2843 pszClass = WC_FRAME;
2844 nNeedsubclass = 1;
2845 }
2846 else
2847 {
2848 nControlId = ulId;
2849 if(nControlId < 0)
2850 nControlId = FID_CLIENT;
2851 }
2852 }
cdf1e714 2853
19193a2c
KB
2854 HWND parent;
2855 if ( GetWindowStyleFlag() & wxPOPUP_WINDOW )
2856 {
2857 // popup windows should have desktop as parent because they shouldn't
2858 // be limited to the parents client area as child windows usually are
2859 parent = HWND_DESKTOP;
2860 }
2861 else if ( hParent )
2862 {
2863 parent = hParent;
2864 }
2865 else
2866 {
2867 // top level window
2868 parent = NULL;
2869 }
2870
f23208ca
DW
2871 //
2872 // We will either have a registered class via string name or a standard PM Class via a long
2873 //
19193a2c
KB
2874 m_hWnd = (WXHWND)::WinCreateWindow(parent, zClass,
2875 (PSZ)zTitle ? zTitle : wxT(""),
2876 dwStyle, lX1, lY1, lWidth, lHeight,
2877 hOwner, HWND_TOP, (ULONG)nControlId,
2878 pCtlData, pPresParams);
2879
f23208ca
DW
2880 if (!m_hWnd)
2881 {
2882 vError = ::WinGetLastError(vHabmain);
2883 sError = wxPMErrorToStr(vError);
2884 wxLogError("Can't create window of class %s!. Error: %s\n", zClass, sError);
2885 return FALSE;
cdf1e714 2886 }
008089f6 2887 m_dwExStyle = dwExStyle;
f6bcfd97 2888 ::WinSetWindowULong(m_hWnd, QWL_USER, (ULONG) this);
cdf1e714 2889 wxWndHook = NULL;
61243a51 2890
cdf1e714 2891#ifdef __WXDEBUG__
61243a51
DW
2892 wxNode* pNode = wxWinHandleList->Member(this);
2893
2894 if (pNode)
cdf1e714 2895 {
61243a51
DW
2896 HWND hWnd = (HWND)pNode->GetKeyInteger();
2897
2898 if (hWnd != (HWND)m_hWnd)
2899
cdf1e714
DW
2900 {
2901 wxLogError("A second HWND association is being added for the same window!");
2902 }
2903 }
2904#endif
61243a51
DW
2905 wxAssociateWinWithHandle((HWND)m_hWnd
2906 ,this
2907 );
cd212ee4 2908 //
e604d44b
DW
2909 // Now need to subclass window.
2910 //
51c1d535
DW
2911 if(!nNeedsubclass)
2912 {
2913 wxAssociateWinWithHandle((HWND)m_hWnd,this);
2914 }
2915 else
2916 {
2917 SubclassWin(GetHWND());
2918 }
cdf1e714 2919 return TRUE;
0367c1c0 2920} // end of wxWindowOS2::OS2Create
cdf1e714
DW
2921
2922// ===========================================================================
2923// OS2 PM message handlers
2924// ===========================================================================
2925
2926// ---------------------------------------------------------------------------
61243a51 2927// window creation/destruction
cdf1e714
DW
2928// ---------------------------------------------------------------------------
2929
0367c1c0 2930bool wxWindowOS2::HandleCreate(
19193a2c 2931 WXLPCREATESTRUCT WXUNUSED(vCs)
61243a51
DW
2932, bool* pbMayCreate
2933)
cdf1e714 2934{
19193a2c 2935 wxWindowCreateEvent vEvent((wxWindow*)this);
cdf1e714 2936
61243a51
DW
2937 (void)GetEventHandler()->ProcessEvent(vEvent);
2938 *pbMayCreate = TRUE;
cdf1e714 2939 return TRUE;
0367c1c0 2940} // end of wxWindowOS2::HandleCreate
cdf1e714 2941
0367c1c0 2942bool wxWindowOS2::HandleDestroy()
cdf1e714 2943{
19193a2c 2944 wxWindowDestroyEvent vEvent((wxWindow*)this);
cdf1e714 2945
61243a51
DW
2946 (void)GetEventHandler()->ProcessEvent(vEvent);
2947
2948 //
2949 // Delete our drop target if we've got one
2950 //
cdf1e714 2951#if wxUSE_DRAG_AND_DROP
61243a51 2952 if (m_dropTarget != NULL)
cdf1e714 2953 {
61243a51 2954 m_dropTarget->Revoke(m_hWnd);
cdf1e714
DW
2955 delete m_dropTarget;
2956 m_dropTarget = NULL;
2957 }
2958#endif // wxUSE_DRAG_AND_DROP
2959
61243a51 2960 //
cdf1e714 2961 // WM_DESTROY handled
61243a51 2962 //
cdf1e714 2963 return TRUE;
0367c1c0 2964} // end of wxWindowOS2::HandleDestroy
cdf1e714
DW
2965
2966// ---------------------------------------------------------------------------
2967// activation/focus
2968// ---------------------------------------------------------------------------
0367c1c0 2969void wxWindowOS2::OnSetFocus(
61243a51
DW
2970 wxFocusEvent& rEvent
2971)
cdf1e714 2972{
61243a51 2973 rEvent.Skip();
0367c1c0 2974} // end of wxWindowOS2::OnSetFocus
61243a51 2975
0367c1c0 2976bool wxWindowOS2::HandleActivate(
61243a51
DW
2977 int nState
2978, WXHWND WXUNUSED(hActivate)
2979)
2980{
2981 wxActivateEvent vEvent( wxEVT_ACTIVATE
2982 ,(bool)nState
2983 ,m_windowId
2984 );
2985 vEvent.SetEventObject(this);
2986 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 2987} // end of wxWindowOS2::HandleActivate
61243a51 2988
0367c1c0 2989bool wxWindowOS2::HandleSetFocus(
61243a51
DW
2990 WXHWND WXUNUSED(hWnd)
2991)
cdf1e714
DW
2992{
2993#if wxUSE_CARET
61243a51 2994 //
cdf1e714 2995 // Deal with caret
61243a51
DW
2996 //
2997 if (m_caret)
cdf1e714
DW
2998 {
2999 m_caret->OnSetFocus();
3000 }
3001#endif // wxUSE_CARET
3002
1bcfc0e1
DW
3003#if wxUSE_TEXTCTRL
3004 // If it's a wxTextCtrl don't send the event as it will be done
3005 // after the control gets to process it from EN_FOCUS handler
3006 if ( wxDynamicCastThis(wxTextCtrl) )
cdf1e714 3007 {
1bcfc0e1 3008 return FALSE;
cdf1e714 3009 }
1bcfc0e1 3010#endif // wxUSE_TEXTCTRL
cdf1e714 3011
61243a51 3012 wxFocusEvent vEvent(wxEVT_SET_FOCUS, m_windowId);
cdf1e714 3013
61243a51
DW
3014 vEvent.SetEventObject(this);
3015 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3016} // end of wxWindowOS2::HandleSetFocus
cdf1e714 3017
0367c1c0 3018bool wxWindowOS2::HandleKillFocus(
61243a51
DW
3019 WXHWND WXUNUSED(hWnd)
3020)
cdf1e714
DW
3021{
3022#if wxUSE_CARET
61243a51 3023 //
cdf1e714 3024 // Deal with caret
61243a51
DW
3025 //
3026 if (m_caret)
cdf1e714
DW
3027 {
3028 m_caret->OnKillFocus();
3029 }
3030#endif // wxUSE_CARET
3031
61243a51
DW
3032 wxFocusEvent vEvent( wxEVT_KILL_FOCUS
3033 ,m_windowId
3034 );
cdf1e714 3035
61243a51
DW
3036 vEvent.SetEventObject(this);
3037 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3038} // end of wxWindowOS2::HandleKillFocus
cdf1e714
DW
3039
3040// ---------------------------------------------------------------------------
3041// miscellaneous
3042// ---------------------------------------------------------------------------
3043
0367c1c0 3044bool wxWindowOS2::HandleShow(
61243a51 3045 bool bShow
19193a2c 3046, int WXUNUSED(nStatus)
61243a51 3047)
cdf1e714 3048{
19193a2c 3049 wxShowEvent vEvent(GetId(), bShow);
cdf1e714 3050
61243a51
DW
3051 vEvent.m_eventObject = this;
3052 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3053} // end of wxWindowOS2::HandleShow
cdf1e714 3054
0367c1c0 3055bool wxWindowOS2::HandleInitDialog(
61243a51
DW
3056 WXHWND WXUNUSED(hWndFocus)
3057)
cdf1e714 3058{
61243a51 3059 wxInitDialogEvent vEvent(GetId());
cdf1e714 3060
61243a51
DW
3061 vEvent.m_eventObject = this;
3062 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3063} // end of wxWindowOS2::HandleInitDialog
cdf1e714 3064
19193a2c 3065bool wxWindowOS2::HandleEndDrag(WXWPARAM WXUNUSED(wParam))
cdf1e714 3066{
61243a51 3067 // TODO: We'll handle drag and drop later
cdf1e714
DW
3068 return FALSE;
3069}
3070
0367c1c0 3071bool wxWindowOS2::HandleSetCursor(
19193a2c 3072 USHORT WXUNUSED(vId)
61243a51
DW
3073, WXHWND hPointer
3074)
cdf1e714 3075{
61243a51
DW
3076 //
3077 // Under OS/2 PM this allows the pointer to be changed
3078 // as it passes over a control
3079 //
3080 ::WinSetPointer(HWND_DESKTOP, (HPOINTER)hPointer);
3081 return TRUE;
0367c1c0 3082} // end of wxWindowOS2::HandleSetCursor
cdf1e714
DW
3083
3084// ---------------------------------------------------------------------------
3085// owner drawn stuff
3086// ---------------------------------------------------------------------------
0367c1c0 3087bool wxWindowOS2::OS2OnDrawItem(
61243a51
DW
3088 int vId
3089, WXDRAWITEMSTRUCT* pItemStruct
3090)
cdf1e714 3091{
19193a2c 3092#if wxUSE_OWNER_DRAWN
402e2f7c 3093 wxDC vDc;
61243a51 3094
19193a2c 3095#if wxUSE_MENUS_NATIVE
61243a51 3096 //
402e2f7c 3097 // Is it a menu item?
61243a51 3098 //
402e2f7c
DW
3099 if (vId == 0)
3100 {
5afb9458
DW
3101 ERRORID vError;
3102 wxString sError;
402e2f7c 3103 POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
23122f8c
DW
3104 wxFrame* pFrame = (wxFrame*)this;
3105 wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
402e2f7c 3106 HDC hDC = ::GpiQueryDevice(pMeasureStruct->hps);
23122f8c
DW
3107 wxRect vRect( pMeasureStruct->rclItem.xLeft
3108 ,pMeasureStruct->rclItem.yBottom
3109 ,pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft
3110 ,pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom
3111 );
402e2f7c
DW
3112 vDc.SetHDC( hDC
3113 ,FALSE
3114 );
3115 vDc.SetHPS(pMeasureStruct->hps);
5afb9458
DW
3116 //
3117 // Load the wxWindows Pallete and set to RGB mode
3118 //
3119 if (!::GpiCreateLogColorTable( pMeasureStruct->hps
3120 ,0L
3121 ,LCOLF_CONSECRGB
3122 ,0L
3123 ,(LONG)wxTheColourDatabase->m_nSize
3124 ,(PLONG)wxTheColourDatabase->m_palTable
3125 ))
3126 {
3127 vError = ::WinGetLastError(vHabmain);
3128 sError = wxPMErrorToStr(vError);
3129 wxLogError("Unable to set current color table. Error: %s\n", sError);
3130 }
3131 //
3132 // Set the color table to RGB mode
3133 //
3134 if (!::GpiCreateLogColorTable( pMeasureStruct->hps
3135 ,0L
3136 ,LCOLF_RGB
3137 ,0L
3138 ,0L
3139 ,NULL
3140 ))
3141 {
3142 vError = ::WinGetLastError(vHabmain);
3143 sError = wxPMErrorToStr(vError);
3144 wxLogError("Unable to set current color table. Error: %s\n", sError);
3145 }
cdf1e714 3146
23122f8c
DW
3147 wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
3148
3149
3150 int eAction = 0;
3151 int eStatus = 0;
cdf1e714 3152
402e2f7c 3153 if (pMeasureStruct->fsAttribute == pMeasureStruct->fsAttributeOld)
23122f8c
DW
3154 {
3155 //
3156 // Entire Item needs to be redrawn (either it has reappeared from
3157 // behind another window or is being displayed for the first time
3158 //
402e2f7c 3159 eAction = wxOwnerDrawn::wxODDrawAll;
23122f8c
DW
3160
3161 if (pMeasureStruct->fsAttribute & MIA_HILITED)
3162 {
3163 //
3164 // If it is currently selected we let the system handle it
3165 //
3166 eStatus |= wxOwnerDrawn::wxODSelected;
3167 }
3168 if (pMeasureStruct->fsAttribute & MIA_CHECKED)
3169 {
3170 //
3171 // If it is currently checked we draw our own
3172 //
3173 eStatus |= wxOwnerDrawn::wxODChecked;
3174 pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_CHECKED;
3175 }
3176 if (pMeasureStruct->fsAttribute & MIA_DISABLED)
3177 {
3178 //
3179 // If it is currently disabled we let the system handle it
3180 //
3181 eStatus |= wxOwnerDrawn::wxODDisabled;
3182 }
3183 //
3184 // Don't really care about framed (indicationg focus) or NoDismiss
3185 //
3186 }
402e2f7c 3187 else
23122f8c 3188 {
5afb9458
DW
3189 if (pMeasureStruct->fsAttribute & MIA_HILITED)
3190 {
3191 eAction = wxOwnerDrawn::wxODDrawAll;
3192 eStatus |= wxOwnerDrawn::wxODSelected;
3193 //
3194 // Keep the system from trying to highlight with its bogus colors
3195 //
3196 pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_HILITED;
3197 }
3198 else if (!(pMeasureStruct->fsAttribute & MIA_HILITED))
3199 {
3200 eAction = wxOwnerDrawn::wxODDrawAll;
3201 eStatus = 0;
3202 //
3203 // Keep the system from trying to highlight with its bogus colors
3204 //
3205 pMeasureStruct->fsAttribute = pMeasureStruct->fsAttributeOld &= ~MIA_HILITED;
3206 }
3207 else
3208 {
3209 //
3210 // For now we don't care about anything else
3211 // just ignore the entire message!
3212 //
3213 return TRUE;
3214 }
23122f8c
DW
3215 }
3216 //
3217 // Now redraw the item
3218 //
45bedfdd
DW
3219 return(pMenuItem->OnDrawItem( vDc
3220 ,vRect
23122f8c
DW
3221 ,(wxOwnerDrawn::wxODAction)eAction
3222 ,(wxOwnerDrawn::wxODStatus)eStatus
45bedfdd 3223 ));
402e2f7c
DW
3224 //
3225 // leave the fsAttribute and fsOldAttribute unchanged. If different,
3226 // the system will do the highlight or fraeming or disabling for us,
3227 // otherwise, we'd have to do it ourselves.
61243a51 3228 //
cdf1e714 3229 }
19193a2c 3230#endif // wxUSE_MENUS_NATIVE
cdf1e714 3231
402e2f7c
DW
3232 wxWindow* pItem = FindItem(vId);
3233
3234 if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
3235 {
3236 return ((wxControl *)pItem)->OS2OnDraw(pItemStruct);
3237 }
19193a2c
KB
3238#else
3239 vId = vId;
3240 pItemStruct = pItemStruct;
61243a51 3241#endif
402e2f7c 3242 return FALSE;
0367c1c0 3243} // end of wxWindowOS2::OS2OnDrawItem
cdf1e714 3244
0367c1c0 3245bool wxWindowOS2::OS2OnMeasureItem(
402e2f7c
DW
3246 int lId
3247, WXMEASUREITEMSTRUCT* pItemStruct
3248)
0e320a79 3249{
19193a2c 3250#if wxUSE_OWNER_DRAWN
402e2f7c
DW
3251 //
3252 // Is it a menu item?
3253 //
45bedfdd 3254 if (lId == 65536) // I really don't like this...has to be a better indicator
cdf1e714 3255 {
4049cc1c 3256 if (IsKindOf(CLASSINFO(wxFrame))) // we'll assume if Frame then a menu
45bedfdd 3257 {
4049cc1c
DW
3258 size_t nWidth;
3259 size_t nHeight;
3260 POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
45bedfdd
DW
3261 wxFrame* pFrame = (wxFrame*)this;
3262 wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
cdf1e714 3263
45bedfdd 3264 wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
4049cc1c
DW
3265 nWidth = 0L;
3266 nHeight = 0L;
3267 if (pMenuItem->OnMeasureItem( &nWidth
3268 ,&nHeight
3269 ))
3270 {
3271 pMeasureStruct->rclItem.xRight = nWidth;
3272 pMeasureStruct->rclItem.xLeft = 0L;
3273 pMeasureStruct->rclItem.yTop = nHeight;
3274 pMeasureStruct->rclItem.yBottom = 0L;
3275 return TRUE;
3276 }
3277 return FALSE;
45bedfdd 3278 }
cdf1e714 3279 }
f15b4952 3280 wxWindow* pItem = FindItem(lId);
cdf1e714 3281
402e2f7c 3282 if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
cdf1e714 3283 {
402e2f7c 3284 return ((wxControl *)pItem)->OS2OnMeasure(pItemStruct);
cdf1e714 3285 }
19193a2c
KB
3286#else
3287 lId = lId;
3288 pItemStruct = pItemStruct;
3289#endif // wxUSE_OWNER_DRAWN
cdf1e714 3290 return FALSE;
0e320a79
DW
3291}
3292
cdf1e714
DW
3293// ---------------------------------------------------------------------------
3294// colours and palettes
3295// ---------------------------------------------------------------------------
849949b1 3296
0367c1c0 3297bool wxWindowOS2::HandleSysColorChange()
0e320a79 3298{
61243a51 3299 wxSysColourChangedEvent vEvent;
cdf1e714 3300
61243a51
DW
3301 vEvent.SetEventObject(this);
3302 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3303} // end of wxWindowOS2::HandleSysColorChange
0e320a79 3304
0367c1c0 3305bool wxWindowOS2::HandleCtlColor(
19193a2c 3306 WXHBRUSH* WXUNUSED(phBrush)
61243a51 3307)
0e320a79 3308{
61243a51
DW
3309 //
3310 // Not much provided with message. So not sure I can do anything with it
3311 //
3312 return TRUE;
0367c1c0 3313} // end of wxWindowOS2::HandleCtlColor
cdf1e714 3314
0e320a79 3315
cdf1e714 3316// Define for each class of dialog and control
19193a2c
KB
3317WXHBRUSH wxWindowOS2::OnCtlColor(WXHDC WXUNUSED(hDC),
3318 WXHWND WXUNUSED(hWnd),
3319 WXUINT WXUNUSED(nCtlColor),
3320 WXUINT WXUNUSED(message),
3321 WXWPARAM WXUNUSED(wParam),
3322 WXLPARAM WXUNUSED(lParam))
0e320a79 3323{
cdf1e714 3324 return (WXHBRUSH)0;
0e320a79
DW
3325}
3326
0367c1c0 3327bool wxWindowOS2::HandlePaletteChanged()
0e320a79 3328{
61243a51
DW
3329 // need to set this to something first
3330 WXHWND hWndPalChange = NULLHANDLE;
cdf1e714 3331
61243a51
DW
3332 wxPaletteChangedEvent vEvent(GetId());
3333
3334 vEvent.SetEventObject(this);
3335 vEvent.SetChangedWindow(wxFindWinFromHandle(hWndPalChange));
0e320a79 3336
61243a51 3337 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3338} // end of wxWindowOS2::HandlePaletteChanged
61243a51 3339
61243a51 3340//
cdf1e714 3341// Responds to colour changes: passes event on to children.
61243a51 3342//
0367c1c0 3343void wxWindowOS2::OnSysColourChanged(
61243a51
DW
3344 wxSysColourChangedEvent& rEvent
3345)
0e320a79 3346{
61243a51
DW
3347 wxNode* pNode = GetChildren().First();
3348
3349 while (pNode)
cdf1e714 3350 {
61243a51 3351 //
cdf1e714 3352 // Only propagate to non-top-level windows
61243a51
DW
3353 //
3354 wxWindow* pWin = (wxWindow *)pNode->Data();
3355
3356 if (pWin->GetParent())
cdf1e714 3357 {
61243a51 3358 wxSysColourChangedEvent vEvent;
cdf1e714 3359
61243a51
DW
3360 rEvent.m_eventObject = pWin;
3361 pWin->GetEventHandler()->ProcessEvent(vEvent);
3362 }
3363 pNode = pNode->Next();
cdf1e714 3364 }
0367c1c0 3365} // end of wxWindowOS2::OnSysColourChanged
0e320a79 3366
cdf1e714
DW
3367// ---------------------------------------------------------------------------
3368// painting
3369// ---------------------------------------------------------------------------
3370
0367c1c0 3371bool wxWindowOS2::HandlePaint()
0e320a79 3372{
19193a2c
KB
3373 HRGN hRgn;
3374 wxPaintEvent vEvent(m_windowId);
40bd6154
DW
3375 HPS hPS;
3376 RECTL vRect;
19193a2c
KB
3377 bool bProcessed;
3378
3379 // Create empty region
3380 // TODO: get HPS somewhere else if possible
3381 hPS = ::WinGetPS(GetHwnd());
3382 hRgn = ::GpiCreateRegion(hPS, 0, NULL);
61243a51 3383
19193a2c 3384 if (::WinQueryUpdateRegion(GetHwnd(), hRgn) == RGN_ERROR)
61243a51
DW
3385 {
3386 wxLogLastError("CreateRectRgn");
3387 return FALSE;
3388 }
7e99520b 3389
19193a2c
KB
3390 m_updateRegion = wxRegion(hRgn, hPS);
3391
61243a51 3392 vEvent.SetEventObject(this);
19193a2c
KB
3393 bProcessed = GetEventHandler()->ProcessEvent(vEvent);
3394
19193a2c 3395 return GetEventHandler()->ProcessEvent(vEvent); //bProcessed;
0367c1c0 3396} // end of wxWindowOS2::HandlePaint
0e320a79 3397
0367c1c0 3398bool wxWindowOS2::HandleEraseBkgnd(
8d854fa9
DW
3399 WXHDC hDC
3400)
0e320a79 3401{
8d854fa9 3402 SWP vSwp;
19193a2c 3403 bool rc;
8d854fa9
DW
3404
3405 ::WinQueryWindowPos(GetHwnd(), &vSwp);
3406 if (vSwp.fl & SWP_MINIMIZE)
61243a51 3407 return TRUE;
cdf1e714 3408
8d854fa9
DW
3409 wxDC vDC;
3410
3411 vDC.m_hPS = (HPS)hDC; // this is really a PS
19193a2c 3412 vDC.SetWindow((wxWindow*)this);
8d854fa9 3413 vDC.BeginDrawing();
cdf1e714 3414
8d854fa9
DW
3415 wxEraseEvent vEvent(m_windowId, &vDC);
3416
3417 vEvent.SetEventObject(this);
cdf1e714 3418
19193a2c 3419 rc = GetEventHandler()->ProcessEvent(vEvent);
cdf1e714 3420
8d854fa9
DW
3421 vDC.EndDrawing();
3422 vDC.m_hPS = NULLHANDLE;
61243a51 3423 return TRUE;
0367c1c0 3424} // end of wxWindowOS2::HandleEraseBkgnd
cdf1e714 3425
0367c1c0 3426void wxWindowOS2::OnEraseBackground(
61243a51
DW
3427 wxEraseEvent& rEvent
3428)
0e320a79 3429{
8d854fa9
DW
3430 RECTL vRect;
3431 HPS hPS = rEvent.m_dc->m_hPS;
19193a2c
KB
3432 APIRET rc;
3433 LONG lColor = m_backgroundColour.GetPixel();
8d854fa9 3434
19193a2c
KB
3435 rc = ::WinQueryWindowRect(GetHwnd(), &vRect);
3436 rc = ::WinFillRect(hPS, &vRect, lColor);
0367c1c0 3437} // end of wxWindowOS2::OnEraseBackground
0e320a79 3438
cdf1e714
DW
3439// ---------------------------------------------------------------------------
3440// moving and resizing
3441// ---------------------------------------------------------------------------
0e320a79 3442
0367c1c0 3443bool wxWindowOS2::HandleMinimize()
0e320a79 3444{
61243a51 3445 wxIconizeEvent vEvent(m_windowId);
cdf1e714 3446
61243a51
DW
3447 vEvent.SetEventObject(this);
3448 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3449} // end of wxWindowOS2::HandleMinimize
0e320a79 3450
0367c1c0 3451bool wxWindowOS2::HandleMaximize()
0e320a79 3452{
61243a51 3453 wxMaximizeEvent vEvent(m_windowId);
cdf1e714 3454
61243a51
DW
3455 vEvent.SetEventObject(this);
3456 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3457} // end of wxWindowOS2::HandleMaximize
0e320a79 3458
0367c1c0 3459bool wxWindowOS2::HandleMove(
61243a51
DW
3460 int nX
3461, int nY
3462)
0e320a79 3463{
19193a2c 3464 wxMoveEvent vEvent(wxPoint(nX, nY), m_windowId);
cdf1e714 3465
61243a51
DW
3466 vEvent.SetEventObject(this);
3467 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3468} // end of wxWindowOS2::HandleMove
0e320a79 3469
0367c1c0 3470bool wxWindowOS2::HandleSize(
61243a51
DW
3471 int nWidth
3472, int nHeight
3473, WXUINT WXUNUSED(nFlag)
3474)
0e320a79 3475{
19193a2c 3476 wxSizeEvent vEvent(wxSize(nWidth, nHeight), m_windowId);
cdf1e714 3477
61243a51
DW
3478 vEvent.SetEventObject(this);
3479 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3480} // end of wxWindowOS2::HandleSize
0e320a79 3481
0367c1c0 3482bool wxWindowOS2::HandleGetMinMaxInfo(
61243a51
DW
3483 PSWP pSwp
3484)
0e320a79 3485{
61243a51
DW
3486 bool bRc = FALSE;
3487 POINTL vPoint;
cdf1e714 3488
61243a51 3489 switch(pSwp->fl)
cdf1e714 3490 {
61243a51
DW
3491 case SWP_MAXIMIZE:
3492 ::WinGetMaxPosition(GetHwnd(), pSwp);
3493 m_maxWidth = pSwp->cx;
3494 m_maxHeight = pSwp->cy;
3495 break;
cdf1e714 3496
61243a51
DW
3497 case SWP_MINIMIZE:
3498 ::WinGetMinPosition(GetHwnd(), pSwp, &vPoint);
3499 m_minWidth = pSwp->cx;
3500 m_minHeight = pSwp->cy;
3501 break;
cdf1e714 3502
61243a51
DW
3503 default:
3504 return FALSE;
cdf1e714 3505 }
61243a51 3506 return TRUE;
0367c1c0 3507} // end of wxWindowOS2::HandleGetMinMaxInfo
0e320a79 3508
cdf1e714
DW
3509// ---------------------------------------------------------------------------
3510// command messages
3511// ---------------------------------------------------------------------------
0367c1c0 3512bool wxWindowOS2::HandleCommand(
61243a51
DW
3513 WXWORD wId
3514, WXWORD wCmd
3515, WXHWND hControl
3516)
0e320a79 3517{
19193a2c 3518#if wxUSE_MENUS_NATIVE
61243a51 3519 if (wxCurrentPopupMenu)
0e320a79 3520 {
61243a51 3521 wxMenu* pPopupMenu = wxCurrentPopupMenu;
0e320a79 3522
61243a51
DW
3523 wxCurrentPopupMenu = NULL;
3524 return pPopupMenu->OS2Command(wCmd, wId);
cdf1e714 3525 }
19193a2c 3526#endif // wxUSE_MENUS_NATIVE
0e320a79 3527
61243a51
DW
3528 wxWindow* pWin = FindItem(wId);
3529
3530 if (!pWin)
cdf1e714 3531 {
61243a51 3532 pWin = wxFindWinFromHandle(hControl);
0e320a79 3533 }
cdf1e714 3534
61243a51 3535 if (pWin)
19193a2c
KB
3536 return pWin->OS2Command(wCmd, wId);
3537
cdf1e714 3538 return FALSE;
0367c1c0 3539} // end of wxWindowOS2::HandleCommand
de44a9f0 3540
0367c1c0 3541bool wxWindowOS2::HandleSysCommand(
61243a51 3542 WXWPARAM wParam
19193a2c 3543, WXLPARAM WXUNUSED(lParam)
61243a51 3544)
0e320a79 3545{
61243a51
DW
3546 //
3547 // 4 bits are reserved
3548 //
3549 switch (SHORT1FROMMP(wParam))
3550 {
3551 case SC_MAXIMIZE:
3552 return HandleMaximize();
3553
3554 case SC_MINIMIZE:
3555 return HandleMinimize();
3556 }
cdf1e714 3557 return FALSE;
0367c1c0 3558} // end of wxWindowOS2::HandleSysCommand
cdf1e714
DW
3559
3560// ---------------------------------------------------------------------------
3561// mouse events
3562// ---------------------------------------------------------------------------
19193a2c 3563//TODO!!! check against MSW
0367c1c0 3564void wxWindowOS2::InitMouseEvent(
61243a51
DW
3565 wxMouseEvent& rEvent
3566, int nX
3567, int nY
3568, WXUINT uFlags
3569)
cdf1e714 3570{
61243a51
DW
3571 rEvent.m_x = nX;
3572 rEvent.m_y = nY;
3573 rEvent.m_shiftDown = ((uFlags & VK_SHIFT) != 0);
3574 rEvent.m_controlDown = ((uFlags & VK_CTRL) != 0);
3575 rEvent.m_leftDown = ((uFlags & VK_BUTTON1) != 0);
3576 rEvent.m_middleDown = ((uFlags & VK_BUTTON3) != 0);
3577 rEvent.m_rightDown = ((uFlags & VK_BUTTON2) != 0);
3578 rEvent.SetTimestamp(s_currentMsg.time);
3579 rEvent.m_eventObject = this;
cdf1e714
DW
3580
3581#if wxUSE_MOUSEEVENT_HACK
61243a51
DW
3582 m_lastMouseX = nX;
3583 m_lastMouseY = nY;
3584 m_lastMouseEvent = rEvent.GetEventType();
cdf1e714 3585#endif // wxUSE_MOUSEEVENT_HACK
0367c1c0 3586} // end of wxWindowOS2::InitMouseEvent
0e320a79 3587
0367c1c0 3588bool wxWindowOS2::HandleMouseEvent(
61243a51
DW
3589 WXUINT uMsg
3590, int nX
3591, int nY
3592, WXUINT uFlags
3593)
0e320a79 3594{
61243a51
DW
3595 //
3596 // The mouse events take consecutive IDs from WM_MOUSEFIRST to
cdf1e714
DW
3597 // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST
3598 // from the message id and take the value in the table to get wxWin event
3599 // id
61243a51 3600 //
cdf1e714
DW
3601 static const wxEventType eventsMouse[] =
3602 {
3603 wxEVT_MOTION,
3604 wxEVT_LEFT_DOWN,
3605 wxEVT_LEFT_UP,
3606 wxEVT_LEFT_DCLICK,
3607 wxEVT_RIGHT_DOWN,
3608 wxEVT_RIGHT_UP,
3609 wxEVT_RIGHT_DCLICK,
3610 wxEVT_MIDDLE_DOWN,
3611 wxEVT_MIDDLE_UP,
3612 wxEVT_MIDDLE_DCLICK
3613 };
3614
61243a51 3615 wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]);
cdf1e714 3616
61243a51
DW
3617 InitMouseEvent( vEvent
3618 ,nX
3619 ,nY
3620 ,uFlags
3621 );
0e320a79 3622
61243a51 3623 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3624} // end of wxWindowOS2::HandleMouseEvent
61243a51 3625
0367c1c0 3626bool wxWindowOS2::HandleMouseMove(
61243a51
DW
3627 int nX
3628, int nY
3629, WXUINT uFlags
3630)
0e320a79 3631{
61243a51 3632 if (!m_bMouseInWindow)
cdf1e714 3633 {
61243a51 3634 //
cdf1e714 3635 // Generate an ENTER event
61243a51 3636 //
776d87d5 3637 m_bMouseInWindow = TRUE;
cdf1e714 3638
61243a51 3639 wxMouseEvent vEvent(wxEVT_ENTER_WINDOW);
cdf1e714 3640
61243a51
DW
3641 InitMouseEvent( vEvent
3642 ,nX
3643 ,nY
3644 ,uFlags
3645 );
cdf1e714 3646
61243a51 3647 (void)GetEventHandler()->ProcessEvent(vEvent);
cdf1e714 3648 }
61243a51
DW
3649 return HandleMouseEvent( WM_MOUSEMOVE
3650 ,nX
3651 ,nY
3652 ,uFlags
3653 );
0367c1c0 3654} // end of wxWindowOS2::HandleMouseMove
0e320a79 3655
cdf1e714
DW
3656// ---------------------------------------------------------------------------
3657// keyboard handling
3658// ---------------------------------------------------------------------------
3659
61243a51
DW
3660//
3661// Create the key event of the given type for the given key - used by
3662// HandleChar and HandleKeyDown/Up
3663//
0367c1c0 3664wxKeyEvent wxWindowOS2::CreateKeyEvent(
61243a51
DW
3665 wxEventType eType
3666, int nId
3667, WXLPARAM lParam
3668) const
3669{
3670 wxKeyEvent vEvent(eType);
3671
3672 vEvent.SetId(GetId());
3673 vEvent.m_shiftDown = IsShiftDown();
3674 vEvent.m_controlDown = IsCtrlDown();
3675 vEvent.m_altDown = (HIWORD(lParam) & KC_ALT) == KC_ALT;
3676
3677 vEvent.m_eventObject = (wxWindow *)this; // const_cast
3678 vEvent.m_keyCode = nId;
3679 vEvent.SetTimestamp(s_currentMsg.time);
3680
3681 //
3682 // Translate the position to client coords
3683 //
3684 POINTL vPoint;
3685 RECTL vRect;
3686
3687 ::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
3688 ::WinQueryWindowRect( GetHwnd()
3689 ,&vRect
3690 );
3691
3692 vPoint.x -= vRect.xLeft;
3693 vPoint.y -= vRect.yBottom;
3694
3695 vEvent.m_x = vPoint.x;
3696 vEvent.m_y = vPoint.y;
3697
3698 return vEvent;
0367c1c0 3699} // end of wxWindowOS2::CreateKeyEvent
61243a51
DW
3700
3701//
cdf1e714
DW
3702// isASCII is TRUE only when we're called from WM_CHAR handler and not from
3703// WM_KEYDOWN one
61243a51 3704//
0367c1c0 3705bool wxWindowOS2::HandleChar(
987da0d4 3706 WXDWORD wParam
61243a51
DW
3707, WXLPARAM lParam
3708, bool isASCII
3709)
86de7616 3710{
61243a51
DW
3711 bool bCtrlDown = FALSE;
3712 int vId;
3713
3714 if (isASCII)
3715 {
3716 //
3717 // If 1 -> 26, translate to CTRL plus a letter.
3718 //
3719 vId = wParam;
3720 if ((vId > 0) && (vId < 27))
3721 {
3722 switch (vId)
3723 {
3724 case 13:
3725 vId = WXK_RETURN;
3726 break;
3727
3728 case 8:
3729 vId = WXK_BACK;
3730 break;
3731
3732 case 9:
3733 vId = WXK_TAB;
3734 break;
3735
3736 default:
3737 bCtrlDown = TRUE;
3738 vId = vId + 96;
3739 }
3740 }
3741 }
3742 else if ( (vId = wxCharCodeOS2ToWX(wParam)) == 0)
3743 {
3744 //
3745 // It's ASCII and will be processed here only when called from
3746 // WM_CHAR (i.e. when isASCII = TRUE), don't process it now
3747 //
3748 vId = -1;
3749 }
3750
3751 if (vId != -1)
3752 {
3753 wxKeyEvent vEvent(CreateKeyEvent( wxEVT_CHAR
3754 ,vId
3755 ,lParam
3756 ));
3757
3758 if (bCtrlDown)
3759 {
3760 vEvent.m_controlDown = TRUE;
3761 }
3762
3763 if (GetEventHandler()->ProcessEvent(vEvent))
3764 return TRUE;
3765 }
3766 return FALSE;
cdf1e714 3767}
86de7616 3768
0367c1c0 3769bool wxWindowOS2::HandleKeyDown(
61243a51
DW
3770 WXWORD wParam
3771, WXLPARAM lParam
3772)
cdf1e714 3773{
61243a51 3774 int nId = wxCharCodeOS2ToWX(wParam);
86de7616 3775
61243a51
DW
3776 if (!nId)
3777 {
3778 //
3779 // Normal ASCII char
3780 //
3781 nId = wParam;
3782 }
3783
3784 if (nId != -1)
3785 {
3786 wxKeyEvent vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
3787 ,nId
3788 ,lParam
3789 ));
3790
3791 if (GetEventHandler()->ProcessEvent(vEvent))
3792 {
3793 return TRUE;
3794 }
3795 }
3796 return FALSE;
0367c1c0 3797} // end of wxWindowOS2::HandleKeyDown
61243a51 3798
0367c1c0 3799bool wxWindowOS2::HandleKeyUp(
987da0d4 3800 WXDWORD wParam
61243a51
DW
3801, WXLPARAM lParam
3802)
86de7616 3803{
61243a51
DW
3804 int nId = wxCharCodeOS2ToWX(wParam);
3805
3806 if (!nId)
3807 {
3808 //
3809 // Normal ASCII char
3810 //
3811 nId = wParam;
3812 }
3813
3814 if (nId != -1)
3815 {
3816 wxKeyEvent vEvent(CreateKeyEvent( wxEVT_KEY_UP
3817 ,nId
3818 ,lParam
3819 ));
3820
3821 if (GetEventHandler()->ProcessEvent(vEvent))
3822 return TRUE;
3823 }
3824 return FALSE;
0367c1c0 3825} // end of wxWindowOS2::HandleKeyUp
86de7616 3826
cdf1e714
DW
3827// ---------------------------------------------------------------------------
3828// joystick
3829// ---------------------------------------------------------------------------
86de7616 3830
cdf1e714
DW
3831// ---------------------------------------------------------------------------
3832// scrolling
3833// ---------------------------------------------------------------------------
3834
0367c1c0 3835bool wxWindowOS2::OS2OnScroll(
61243a51
DW
3836 int nOrientation
3837, WXWORD wParam
3838, WXWORD wPos
3839, WXHWND hControl
3840)
cdf1e714 3841{
61243a51 3842 if (hControl)
86de7616 3843 {
61243a51
DW
3844 wxWindow* pChild = wxFindWinFromHandle(hControl);
3845
3846 if (pChild )
3847 return pChild->OS2OnScroll( nOrientation
3848 ,wParam
3849 ,wPos
3850 ,hControl
3851 );
cdf1e714 3852 }
86de7616 3853
61243a51
DW
3854 wxScrollWinEvent vEvent;
3855
3856 vEvent.SetPosition(wPos);
3857 vEvent.SetOrientation(nOrientation);
3858 vEvent.m_eventObject = this;
3859
3860 switch (wParam)
3861 {
3862 case SB_LINEUP:
3863 vEvent.m_eventType = wxEVT_SCROLLWIN_LINEUP;
3864 break;
3865
3866 case SB_LINEDOWN:
3867 vEvent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN;
3868 break;
3869
3870 case SB_PAGEUP:
3871 vEvent.m_eventType = wxEVT_SCROLLWIN_PAGEUP;
3872 break;
3873
3874 case SB_PAGEDOWN:
3875 vEvent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN;
3876 break;
3877
3878 case SB_SLIDERPOSITION:
3879 vEvent.m_eventType = wxEVT_SCROLLWIN_THUMBRELEASE;
3880 break;
3881
3882 case SB_SLIDERTRACK:
3883 vEvent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
3884 break;
3885
3886 default:
3887 return FALSE;
3888 }
3889 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3890} // end of wxWindowOS2::OS2OnScroll
86de7616 3891
d8a3f66c
DW
3892void wxWindowOS2::MoveChildren(
3893 int nDiff
3894)
3895{
3896 SWP vSwp;
3897
3898 for (wxWindowList::Node* pNode = GetChildren().GetFirst();
3899 pNode;
3900 pNode = pNode->GetNext())
3901 {
3902 wxWindow* pWin = pNode->GetData();
3903
3904 ::WinQueryWindowPos( GetHwndOf(pWin)
3905 ,&vSwp
3906 );
3907 if (pWin->IsKindOf(CLASSINFO(wxControl)))
3908 {
3909 wxControl* pCtrl;
3910
3911 //
3912 // Must deal with controls that have margins like ENTRYFIELD. The SWP
3913 // struct of such a control will have and origin offset from its intended
3914 // position by the width of the margins.
3915 //
3916 pCtrl = wxDynamicCast(pWin, wxControl);
3917 vSwp.y -= pCtrl->GetYComp();
3918 vSwp.x -= pCtrl->GetXComp();
3919 }
3920 ::WinSetWindowPos( GetHwndOf(pWin)
3921 ,HWND_TOP
3922 ,vSwp.x
3923 ,vSwp.y - nDiff
3924 ,vSwp.cx
3925 ,vSwp.cy
3926 ,SWP_MOVE
3927 );
3928 if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
3929 {
3930 wxRadioBox* pRadioBox;
3931
3932 pRadioBox = wxDynamicCast(pWin, wxRadioBox);
3933 pRadioBox->AdjustButtons( (int)vSwp.x
3934 ,(int)vSwp.y - nDiff
3935 ,(int)vSwp.cx
3936 ,(int)vSwp.cy
3937 ,pRadioBox->GetSizeFlags()
3938 );
3939 }
3940 if (pWin->IsKindOf(CLASSINFO(wxSlider)))
3941 {
3942 wxSlider* pSlider;
3943
3944 pSlider = wxDynamicCast(pWin, wxSlider);
3945 pSlider->AdjustSubControls( (int)vSwp.x
3946 ,(int)vSwp.y - nDiff
3947 ,(int)vSwp.cx
3948 ,(int)vSwp.cy
3949 ,(int)pSlider->GetSizeFlags()
3950 );
3951 }
3952 }
3953} // end of wxWindowOS2::MoveChildren
3954
3955//
3956// Getting the Y position for a window, like a control, is a real
3957// pain. There are three sitatuions we must deal with in determining
3958// the OS2 to wxWindows Y coordinate.
3959//
3960// 1) The controls are created in a dialog.
3961// This is the easiest since a dialog is created with its original
3962// size so the standard: Y = ParentHeight - (Y + ControlHeight);
3963//
3964// 2) The controls are direct children of a frame
3965// In this instance the controls are actually children of the Frame's
3966// client. During creation the frame's client resizes several times
3967// during creation of the status bar and toolbars. The CFrame class
3968// will take care of this using its AlterChildPos proc.
3969//
3970// 3) The controls are children of a panel, which in turn is a child of
3971// a frame.
3972// This is the nastiest case. A panel is created as the only child of
3973// the frame and as such, when a frame has only one child, the child is
3974// expanded to fit the entire client area of the frame. Because the
3975// controls are created BEFORE this occurs their positions are totally
3976// whacked and any call to WinQueryWindowPos will return invalid
3977// coordinates. So for this situation we have to compare the size of
3978// the panel at control creation time with that of the frame client. If
3979// they are the same we can use the standard Y position equation. If
3980// not, then we must use the Frame Client's dimensions to position them
3981// as that will be the eventual size of the panel after the frame resizes
3982// it!
3983//
3984int wxWindowOS2::GetOS2ParentHeight(
3985 wxWindowOS2* pParent
3986)
3987{
3988 wxWindowOS2* pGrandParent = NULL;
3989
3990 //
3991 // Case 1
3992 //
3993 if (pParent->IsKindOf(CLASSINFO(wxDialog)))
3994 return(pParent->GetSize().y);
3995
3996 //
3997 // Case 2 -- if we are one of the separately built standard Frame
3998 // children, like a statusbar, menubar, or toolbar we want to
3999 // use the frame, itself, for positioning. Otherwise we are
4000 // child window and want to use the Frame's client.
4001 //
4002 else if (pParent->IsKindOf(CLASSINFO(wxFrame)))
4003 {
4004 if (IsKindOf(CLASSINFO(wxStatusBar)) ||
4005 IsKindOf(CLASSINFO(wxMenuBar)) ||
4006 IsKindOf(CLASSINFO(wxToolBar))
4007 )
4008 return(pParent->GetSize().y);
4009 else
4010 return(pParent->GetClientSize().y);
4011 }
4012
4013 //
4014 // Case 3 -- this is for any window that is the sole child of a Frame.
4015 // The grandparent must exist and it must be of type CFrame
4016 // and it's height must be different. Otherwise the standard
4017 // applies.
4018 //
4019 else
4020 {
4021 pGrandParent = pParent->GetParent();
4022 if (pGrandParent &&
4023 pGrandParent->IsKindOf(CLASSINFO(wxFrame)) &&
4024 pGrandParent->GetClientSize().y != pParent->GetSize().y
4025 )
4026 {
4027 int nParentHeight = 0L;
4028 int nStatusBarHeight = 0L;
4029 wxFrame* pFrame = wxDynamicCast(pGrandParent, wxFrame);
4030 wxStatusBar* pStatbar = pFrame->GetStatusBar();
4031
4032 nParentHeight = pGrandParent->GetClientSize().y;
4033 if (pStatbar)
4034 nStatusBarHeight = pStatbar->GetSize().y;
4035 nParentHeight -= nStatusBarHeight;
4036 return(nParentHeight);
4037 }
4038 else
4039 //
4040 // Panel is a child of some other kind of window so we'll
4041 // just use it's original size
4042 //
4043 return(pParent->GetClientSize().y);
4044 }
4045 return(0L);
4046} // end of wxWindowOS2::GetOS2ParentHeight
4047
cdf1e714
DW
4048// ===========================================================================
4049// global functions
4050// ===========================================================================
4051
61243a51 4052void wxGetCharSize(
987da0d4
DW
4053 WXHWND hWnd
4054, int* pX
4055, int* pY
19193a2c 4056,wxFont* WXUNUSED(pTheFont)
61243a51 4057)
cdf1e714 4058{
987da0d4
DW
4059 FONTMETRICS vFM;
4060 HPS hPS;
4061 BOOL rc;
4062
4063 hPS =::WinGetPS(hWnd);
4064
4065 rc = ::GpiQueryFontMetrics(hPS, sizeof(FONTMETRICS), &vFM);
4066 if (rc)
4067 {
4068 if (pX)
4069 *pX = vFM.lAveCharWidth;
4070 if (pY)
4071 *pY = vFM.lEmHeight + vFM.lExternalLeading;
4072 }
4073 else
4074 {
4075 if (pX)
4076 *pX = 10;
4077 if (pY)
4078 *pY = 15;
4079 }
4080 ::WinReleasePS(hPS);
61243a51 4081} // end of wxGetCharSize
cdf1e714 4082
61243a51 4083//
cdf1e714
DW
4084// Returns 0 if was a normal ASCII value, not a special key. This indicates that
4085// the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
61243a51
DW
4086//
4087int wxCharCodeOS2ToWX(
4088 int nKeySym
4089)
cdf1e714 4090{
61243a51
DW
4091 int nId = 0;
4092
4093 switch (nKeySym)
4094 {
4095 case VK_BACKTAB: nId = WXK_BACK; break;
4096 case VK_TAB: nId = WXK_TAB; break;
4097 case VK_CLEAR: nId = WXK_CLEAR; break;
4098 case VK_ENTER: nId = WXK_RETURN; break;
4099 case VK_SHIFT: nId = WXK_SHIFT; break;
4100 case VK_CTRL: nId = WXK_CONTROL; break;
4101 case VK_PAUSE: nId = WXK_PAUSE; break;
4102 case VK_SPACE: nId = WXK_SPACE; break;
4103 case VK_ESC: nId = WXK_ESCAPE; break;
4104 case VK_END: nId = WXK_END; break;
4105 case VK_HOME : nId = WXK_HOME; break;
4106 case VK_LEFT : nId = WXK_LEFT; break;
4107 case VK_UP: nId = WXK_UP; break;
4108 case VK_RIGHT: nId = WXK_RIGHT; break;
4109 case VK_DOWN : nId = WXK_DOWN; break;
4110 case VK_PRINTSCRN: nId = WXK_PRINT; break;
4111 case VK_INSERT: nId = WXK_INSERT; break;
4112 case VK_DELETE: nId = WXK_DELETE; break;
4113 case VK_F1: nId = WXK_F1; break;
4114 case VK_F2: nId = WXK_F2; break;
4115 case VK_F3: nId = WXK_F3; break;
4116 case VK_F4: nId = WXK_F4; break;
4117 case VK_F5: nId = WXK_F5; break;
4118 case VK_F6: nId = WXK_F6; break;
4119 case VK_F7: nId = WXK_F7; break;
4120 case VK_F8: nId = WXK_F8; break;
4121 case VK_F9: nId = WXK_F9; break;
4122 case VK_F10: nId = WXK_F10; break;
4123 case VK_F11: nId = WXK_F11; break;
4124 case VK_F12: nId = WXK_F12; break;
4125 case VK_F13: nId = WXK_F13; break;
4126 case VK_F14: nId = WXK_F14; break;
4127 case VK_F15: nId = WXK_F15; break;
4128 case VK_F16: nId = WXK_F16; break;
4129 case VK_F17: nId = WXK_F17; break;
4130 case VK_F18: nId = WXK_F18; break;
4131 case VK_F19: nId = WXK_F19; break;
4132 case VK_F20: nId = WXK_F20; break;
4133 case VK_F21: nId = WXK_F21; break;
4134 case VK_F22: nId = WXK_F22; break;
4135 case VK_F23: nId = WXK_F23; break;
4136 case VK_F24: nId = WXK_F24; break;
4137 case VK_NUMLOCK: nId = WXK_NUMLOCK; break;
4138 case VK_SCRLLOCK: nId = WXK_SCROLL; break;
4139 default:
86de7616 4140 {
cdf1e714 4141 return 0;
86de7616
DW
4142 }
4143 }
61243a51
DW
4144 return nId;
4145} // end of wxCharCodeOS2ToWX
86de7616 4146
61243a51
DW
4147int wxCharCodeWXToOS2(
4148 int nId
4149, bool* bIsVirtual
4150)
86de7616 4151{
61243a51
DW
4152 int nKeySym = 0;
4153
4154 *bIsVirtual = TRUE;
4155 switch (nId)
4156 {
4157 case WXK_CLEAR: nKeySym = VK_CLEAR; break;
4158 case WXK_SHIFT: nKeySym = VK_SHIFT; break;
4159 case WXK_CONTROL: nKeySym = VK_CTRL; break;
4160 case WXK_PAUSE: nKeySym = VK_PAUSE; break;
4161 case WXK_END: nKeySym = VK_END; break;
4162 case WXK_HOME : nKeySym = VK_HOME; break;
4163 case WXK_LEFT : nKeySym = VK_LEFT; break;
4164 case WXK_UP: nKeySym = VK_UP; break;
4165 case WXK_RIGHT: nKeySym = VK_RIGHT; break;
4166 case WXK_DOWN : nKeySym = VK_DOWN; break;
4167 case WXK_PRINT: nKeySym = VK_PRINTSCRN; break;
4168 case WXK_INSERT: nKeySym = VK_INSERT; break;
4169 case WXK_DELETE: nKeySym = VK_DELETE; break;
4170 case WXK_F1: nKeySym = VK_F1; break;
4171 case WXK_F2: nKeySym = VK_F2; break;
4172 case WXK_F3: nKeySym = VK_F3; break;
4173 case WXK_F4: nKeySym = VK_F4; break;
4174 case WXK_F5: nKeySym = VK_F5; break;
4175 case WXK_F6: nKeySym = VK_F6; break;
4176 case WXK_F7: nKeySym = VK_F7; break;
4177 case WXK_F8: nKeySym = VK_F8; break;
4178 case WXK_F9: nKeySym = VK_F9; break;
4179 case WXK_F10: nKeySym = VK_F10; break;
4180 case WXK_F11: nKeySym = VK_F11; break;
4181 case WXK_F12: nKeySym = VK_F12; break;
4182 case WXK_F13: nKeySym = VK_F13; break;
4183 case WXK_F14: nKeySym = VK_F14; break;
4184 case WXK_F15: nKeySym = VK_F15; break;
4185 case WXK_F16: nKeySym = VK_F16; break;
4186 case WXK_F17: nKeySym = VK_F17; break;
4187 case WXK_F18: nKeySym = VK_F18; break;
4188 case WXK_F19: nKeySym = VK_F19; break;
4189 case WXK_F20: nKeySym = VK_F20; break;
4190 case WXK_F21: nKeySym = VK_F21; break;
4191 case WXK_F22: nKeySym = VK_F22; break;
4192 case WXK_F23: nKeySym = VK_F23; break;
4193 case WXK_F24: nKeySym = VK_F24; break;
4194 case WXK_NUMLOCK: nKeySym = VK_NUMLOCK; break;
4195 case WXK_SCROLL: nKeySym = VK_SCRLLOCK; break;
4196 default:
cdf1e714 4197 {
61243a51
DW
4198 *bIsVirtual = FALSE;
4199 nKeySym = nId;
cdf1e714
DW
4200 break;
4201 }
86de7616 4202 }
61243a51
DW
4203 return nKeySym;
4204} // end of wxCharCodeWXToOS2
86de7616 4205
61243a51 4206wxWindow* wxGetActiveWindow()
cdf1e714 4207{
61243a51 4208 HWND hWnd = ::WinQueryActiveWindow(HWND_DESKTOP);
86de7616 4209
61243a51
DW
4210 if (hWnd != 0)
4211 {
4212 return wxFindWinFromHandle((WXHWND)hWnd);
4213 }
4214 return NULL;
4215} // end of wxGetActiveWindow
cdf1e714
DW
4216
4217#ifdef __WXDEBUG__
61243a51
DW
4218const char* wxGetMessageName(
4219 int nMessage)
cdf1e714 4220{
61243a51 4221 switch (nMessage)
86de7616 4222 {
cdf1e714
DW
4223 case 0x0000: return "WM_NULL";
4224 case 0x0001: return "WM_CREATE";
4225 case 0x0002: return "WM_DESTROY";
61243a51
DW
4226 case 0x0004: return "WM_ENABLE";
4227 case 0x0005: return "WM_SHOW";
4228 case 0x0006: return "WM_MOVE";
4229 case 0x0007: return "WM_SIZE";
4230 case 0x0008: return "WM_ADJUSTWINDOWPOS";
4231 case 0x0009: return "WM_CALCVALIDRECTS";
4232 case 0x000A: return "WM_SETWINDOWPARAMS";
4233 case 0x000B: return "WM_QUERYWINDOWPARAMS";
4234 case 0x000C: return "WM_HITTEST";
4235 case 0x000D: return "WM_ACTIVATE";
4236 case 0x000F: return "WM_SETFOCUS";
4237 case 0x0010: return "WM_SETSELECTION";
4238 case 0x0011: return "WM_PPAINT";
4239 case 0x0012: return "WM_PSETFOCUS";
4240 case 0x0013: return "WM_PSYSCOLORCHANGE";
4241 case 0x0014: return "WM_PSIZE";
4242 case 0x0015: return "WM_PACTIVATE";
4243 case 0x0016: return "WM_PCONTROL";
4244 case 0x0020: return "WM_COMMAND";
4245 case 0x0021: return "WM_SYSCOMMAND";
4246 case 0x0022: return "WM_HELP";
4247 case 0x0023: return "WM_PAINT";
4248 case 0x0024: return "WM_TIMER";
4249 case 0x0025: return "WM_SEM1";
4250 case 0x0026: return "WM_SEM2";
4251 case 0x0027: return "WM_SEM3";
4252 case 0x0028: return "WM_SEM4";
4253 case 0x0029: return "WM_CLOSE";
4254 case 0x002A: return "WM_QUIT";
4255 case 0x002B: return "WM_SYSCOLORCHANGE";
4256 case 0x002D: return "WM_SYSVALUECHANGE";
4257 case 0x002E: return "WM_APPTERMINATENOTIFY";
4258 case 0x002F: return "WM_PRESPARAMCHANGED";
4259 // Control notification messages
4260 case 0x0030: return "WM_CONTROL";
4261 case 0x0031: return "WM_VSCROLL";
4262 case 0x0032: return "WM_HSCROLL";
4263 case 0x0033: return "WM_INITMENU";
4264 case 0x0034: return "WM_MENUSELECT";
4265 case 0x0035: return "WM_MENUSEND";
4266 case 0x0036: return "WM_DRAWITEM";
4267 case 0x0037: return "WM_MEASUREITEM";
4268 case 0x0038: return "WM_CONTROLPOINTER";
4269 case 0x003A: return "WM_QUERYDLGCODE";
4270 case 0x003B: return "WM_INITDLG";
4271 case 0x003C: return "WM_SUBSTITUTESTRING";
4272 case 0x003D: return "WM_MATCHMNEMONIC";
4273 case 0x003E: return "WM_SAVEAPPLICATION";
4274 case 0x0129: return "WM_CTLCOLORCHANGE";
4275 case 0x0130: return "WM_QUERYCTLTYPE";
4276 // Frame messages
4277 case 0x0040: return "WM_FLASHWINDOW";
4278 case 0x0041: return "WM_FORMATFRAME";
4279 case 0x0042: return "WM_UPDATEFRAME";
4280 case 0x0043: return "WM_FOCUSCHANGE";
4281 case 0x0044: return "WM_SETBORDERSIZE";
4282 case 0x0045: return "WM_TRACKFRAME";
4283 case 0x0046: return "WM_MINMAXFRAME";
4284 case 0x0047: return "WM_SETICON";
4285 case 0x0048: return "WM_QUERYICON";
4286 case 0x0049: return "WM_SETACCELTABLE";
4287 case 0x004A: return "WM_QUERYACCELTABLE";
4288 case 0x004B: return "WM_TRANSLATEACCEL";
4289 case 0x004C: return "WM_QUERYTRACKINFO";
4290 case 0x004D: return "WM_QUERYBORDERSIZE";
4291 case 0x004E: return "WM_NEXTMENU";
4292 case 0x004F: return "WM_ERASEBACKGROUND";
4293 case 0x0050: return "WM_QUERYFRAMEINFO";
4294 case 0x0051: return "WM_QUERYFOCUSCHAIN";
4295 case 0x0052: return "WM_OWNERPOSCHANGE";
4296 case 0x0053: return "WM_CACLFRAMERECT";
4297 case 0x0055: return "WM_WINDOWPOSCHANGED";
4298 case 0x0056: return "WM_ADJUSTFRAMEPOS";
4299 case 0x0059: return "WM_QUERYFRAMECTLCOUNT";
4300 case 0x005B: return "WM_QUERYHELPINFO";
4301 case 0x005C: return "WM_SETHELPINFO";
4302 case 0x005D: return "WM_ERROR";
4303 case 0x005E: return "WM_REALIZEPALETTE";
4304 // Clipboard messages
4305 case 0x0060: return "WM_RENDERFMT";
4306 case 0x0061: return "WM_RENDERALLFMTS";
4307 case 0x0062: return "WM_DESTROYCLIPBOARD";
4308 case 0x0063: return "WM_PAINTCLIPBOARD";
4309 case 0x0064: return "WM_SIZECLIPBOARD";
4310 case 0x0065: return "WM_HSCROLLCLIPBOARD";
4311 case 0x0066: return "WM_VSCROLLCLIPBOARD";
4312 case 0x0067: return "WM_DRAWCLIPBOARD";
4313 // mouse messages
4314 case 0x0070: return "WM_MOUSEMOVE";
4315 case 0x0071: return "WM_BUTTON1DOWN";
4316 case 0x0072: return "WM_BUTTON1UP";
4317 case 0x0073: return "WM_BUTTON1DBLCLK";
4318 case 0x0074: return "WM_BUTTON2DOWN";
4319 case 0x0075: return "WM_BUTTON2UP";
4320 case 0x0076: return "WM_BUTTON2DBLCLK";
4321 case 0x0077: return "WM_BUTTON3DOWN";
4322 case 0x0078: return "WM_BUTTON3UP";
4323 case 0x0079: return "WM_BUTTON3DBLCLK";
4324 case 0x007D: return "WM_MOUSEMAP";
4325 case 0x007E: return "WM_VRNDISABLED";
4326 case 0x007F: return "WM_VRNENABLED";
4327 case 0x0410: return "WM_CHORD";
4328 case 0x0411: return "WM_BUTTON1MOTIONSTART";
4329 case 0x0412: return "WM_BUTTON1MOTIONEND";
4330 case 0x0413: return "WM_BUTTON1CLICK";
4331 case 0x0414: return "WM_BUTTON2MOTIONSTART";
4332 case 0x0415: return "WM_BUTTON2MOTIONEND";
4333 case 0x0416: return "WM_BUTTON2CLICK";
4334 case 0x0417: return "WM_BUTTON3MOTIONSTART";
4335 case 0x0418: return "WM_BUTTON3MOTIONEND";
4336 case 0x0419: return "WM_BUTTON3CLICK";
4337 case 0x0420: return "WM_BEGINDRAG";
4338 case 0x0421: return "WM_ENDDRAG";
4339 case 0x0422: return "WM_SINGLESELECT";
4340 case 0x0423: return "WM_OPEN";
4341 case 0x0424: return "WM_CONTEXTMENU";
4342 case 0x0425: return "WM_CONTEXTHELP";
4343 case 0x0426: return "WM_TEXTEDIT";
4344 case 0x0427: return "WM_BEGINSELECT";
4345 case 0x0228: return "WM_ENDSELECT";
4346 case 0x0429: return "WM_PICKUP";
4347 case 0x04C0: return "WM_PENFIRST";
4348 case 0x04FF: return "WM_PENLAST";
4349 case 0x0500: return "WM_MMPMFIRST";
4350 case 0x05FF: return "WM_MMPMLAST";
4351 case 0x0600: return "WM_STDDLGFIRST";
4352 case 0x06FF: return "WM_STDDLGLAST";
4353 case 0x0BD0: return "WM_BIDI_FIRST";
4354 case 0x0BFF: return "WM_BIDI_LAST";
4355 // keyboard input
4356 case 0x007A: return "WM_CHAR";
4357 case 0x007B: return "WM_VIOCHAR";
4358 // DDE messages
4359 case 0x00A0: return "WM_DDE_INITIATE";
4360 case 0x00A1: return "WM_DDE_REQUEST";
4361 case 0x00A2: return "WM_DDE_ACK";
4362 case 0x00A3: return "WM_DDE_DATA";
4363 case 0x00A4: return "WM_DDE_ADVISE";
4364 case 0x00A5: return "WM_DDE_UNADVISE";
4365 case 0x00A6: return "WM_DDE_POKE";
4366 case 0x00A7: return "WM_DDE_EXECUTE";
4367 case 0x00A8: return "WM_DDE_TERMINATE";
4368 case 0x00A9: return "WM_DDE_INITIATEACK";
4369 case 0x00AF: return "WM_DDE_LAST";
4370 // Buttons
4371 case 0x0120: return "BM_CLICK";
4372 case 0x0121: return "BM_QUERYCHECKINDEX";
4373 case 0x0122: return "BM_QUERYHILITE";
4374 case 0x0123: return "BM_SETHILITE";
4375 case 0x0124: return "BM_QUERYCHECK";
4376 case 0x0125: return "BM_SETCHECK";
4377 case 0x0126: return "BM_SETDEFAULT";
4378 case 0x0128: return "BM_AUTOSIZE";
4379 // Combo boxes
4380 case 0x029A: return "CBID_LIST";
4381 case 0x029B: return "CBID_EDIT";
4382 case 0x0170: return "CBM_SHOWLIST";
4383 case 0x0171: return "CBM_HILITE";
4384 case 0x0172: return "CBM_ISLISTSHOWING";
4385 // Edit fields
4386 case 0x0140: return "EM_QUERYCHANGED";
4387 case 0x0141: return "EM_QUERYSEL";
4388 case 0x0142: return "EM_SETSEL";
4389 case 0x0143: return "EM_SETTEXTLIMIT";
4390 case 0x0144: return "EM_CUT";
4391 case 0x0145: return "EM_COPY";
4392 case 0x0146: return "EM_CLEAR";
4393 case 0x0147: return "EM_PASTE";
4394 case 0x0148: return "EM_QUERYFIRSTCHAR";
4395 case 0x0149: return "EM_SETFIRSTCHAR";
4396 case 0x014A: return "EM_QUERYREADONLY";
4397 case 0x014B: return "EM_SETREADONLY";
4398 case 0x014C: return "EM_SETINSERTMODE";
4399 // Listboxes
4400 case 0x0160: return "LM_QUERYITEMCOUNT";
4401 case 0x0161: return "LM_INSERTITEM";
4402 case 0x0162: return "LM_SETOPENINDEX";
4403 case 0x0163: return "LM_DELETEITEM";
4404 case 0x0164: return "LM_SELECTITEM";
4405 case 0x0165: return "LM_QUERYSELECTION";
4406 case 0x0166: return "LM_SETITEMTEXT";
4407 case 0x0167: return "LM_QUERYITEMTEXTLENGTH";
4408 case 0x0168: return "LM_QUERYITEMTEXT";
4409 case 0x0169: return "LM_SETITEMHANDLE";
4410 case 0x016A: return "LM_QUERYITEMHANDLE";
4411 case 0x016B: return "LM_SEARCHSTRING";
4412 case 0x016C: return "LM_SETITEMHEIGHT";
4413 case 0x016D: return "LM_QUERYTOPINDEX";
4414 case 0x016E: return "LM_DELETEALL";
4415 case 0x016F: return "LM_INSERTMULITEMS";
4416 case 0x0660: return "LM_SETITEMWIDTH";
4417 // Menus
4418 case 0x0180: return "MM_INSERTITEM";
4419 case 0x0181: return "MM_DELETEITEM";
4420 case 0x0182: return "MM_QUERYITEM";
4421 case 0x0183: return "MM_SETITEM";
4422 case 0x0184: return "MM_QUERYITEMCOUNT";
4423 case 0x0185: return "MM_STARTMENUMODE";
4424 case 0x0186: return "MM_ENDMENUMODE";
4425 case 0x0188: return "MM_REMOVEITEM";
4426 case 0x0189: return "MM_SELECTITEM";
4427 case 0x018A: return "MM_QUERYSELITEMID";
4428 case 0x018B: return "MM_QUERYITEMTEXT";
4429 case 0x018C: return "MM_QUERYITEMTEXTLENGTH";
4430 case 0x018D: return "MM_SETITEMHANDLE";
4431 case 0x018E: return "MM_SETITEMTEXT";
4432 case 0x018F: return "MM_ITEMPOSITIONFROMID";
4433 case 0x0190: return "MM_ITEMIDFROMPOSITION";
4434 case 0x0191: return "MM_QUERYITEMATTR";
4435 case 0x0192: return "MM_SETITEMATTR";
4436 case 0x0193: return "MM_ISITEMVALID";
4437 case 0x0194: return "MM_QUERYITEMRECT";
4438 case 0x0431: return "MM_QUERYDEFAULTITEMID";
4439 case 0x0432: return "MM_SETDEFAULTITEMID";
4440 // Scrollbars
4441 case 0x01A0: return "SBM_SETSCROLLBAR";
4442 case 0x01A1: return "SBM_SETPOS";
4443 case 0x01A2: return "SBM_QUERYPOS";
4444 case 0x01A3: return "SBM_QUERYRANGE";
4445 case 0x01A6: return "SBM_SETTHUMBSIZE";
4446
4447 // Help messages
4448 case 0x0F00: return "WM_HELPBASE";
4449 case 0x0FFF: return "WM_HELPTOP";
4450 // Beginning of user defined messages
4451 case 0x1000: return "WM_USER";
4452
4453 // wxWindows user defined types
cdf1e714
DW
4454
4455 // listview
61243a51 4456 // case 0x1000 + 0: return "LVM_GETBKCOLOR";
cdf1e714
DW
4457 case 0x1000 + 1: return "LVM_SETBKCOLOR";
4458 case 0x1000 + 2: return "LVM_GETIMAGELIST";
4459 case 0x1000 + 3: return "LVM_SETIMAGELIST";
4460 case 0x1000 + 4: return "LVM_GETITEMCOUNT";
4461 case 0x1000 + 5: return "LVM_GETITEMA";
4462 case 0x1000 + 75: return "LVM_GETITEMW";
4463 case 0x1000 + 6: return "LVM_SETITEMA";
4464 case 0x1000 + 76: return "LVM_SETITEMW";
4465 case 0x1000 + 7: return "LVM_INSERTITEMA";
4466 case 0x1000 + 77: return "LVM_INSERTITEMW";
4467 case 0x1000 + 8: return "LVM_DELETEITEM";
4468 case 0x1000 + 9: return "LVM_DELETEALLITEMS";
4469 case 0x1000 + 10: return "LVM_GETCALLBACKMASK";
4470 case 0x1000 + 11: return "LVM_SETCALLBACKMASK";
4471 case 0x1000 + 12: return "LVM_GETNEXTITEM";
4472 case 0x1000 + 13: return "LVM_FINDITEMA";
4473 case 0x1000 + 83: return "LVM_FINDITEMW";
4474 case 0x1000 + 14: return "LVM_GETITEMRECT";
4475 case 0x1000 + 15: return "LVM_SETITEMPOSITION";
4476 case 0x1000 + 16: return "LVM_GETITEMPOSITION";
4477 case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA";
4478 case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW";
4479 case 0x1000 + 18: return "LVM_HITTEST";
4480 case 0x1000 + 19: return "LVM_ENSUREVISIBLE";
4481 case 0x1000 + 20: return "LVM_SCROLL";
4482 case 0x1000 + 21: return "LVM_REDRAWITEMS";
4483 case 0x1000 + 22: return "LVM_ARRANGE";
4484 case 0x1000 + 23: return "LVM_EDITLABELA";
4485 case 0x1000 + 118: return "LVM_EDITLABELW";
4486 case 0x1000 + 24: return "LVM_GETEDITCONTROL";
4487 case 0x1000 + 25: return "LVM_GETCOLUMNA";
4488 case 0x1000 + 95: return "LVM_GETCOLUMNW";
4489 case 0x1000 + 26: return "LVM_SETCOLUMNA";
4490 case 0x1000 + 96: return "LVM_SETCOLUMNW";
4491 case 0x1000 + 27: return "LVM_INSERTCOLUMNA";
4492 case 0x1000 + 97: return "LVM_INSERTCOLUMNW";
4493 case 0x1000 + 28: return "LVM_DELETECOLUMN";
4494 case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH";
4495 case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH";
4496 case 0x1000 + 31: return "LVM_GETHEADER";
4497 case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE";
4498 case 0x1000 + 34: return "LVM_GETVIEWRECT";
4499 case 0x1000 + 35: return "LVM_GETTEXTCOLOR";
4500 case 0x1000 + 36: return "LVM_SETTEXTCOLOR";
4501 case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR";
4502 case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR";
4503 case 0x1000 + 39: return "LVM_GETTOPINDEX";
4504 case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE";
4505 case 0x1000 + 41: return "LVM_GETORIGIN";
4506 case 0x1000 + 42: return "LVM_UPDATE";
4507 case 0x1000 + 43: return "LVM_SETITEMSTATE";
4508 case 0x1000 + 44: return "LVM_GETITEMSTATE";
4509 case 0x1000 + 45: return "LVM_GETITEMTEXTA";
4510 case 0x1000 + 115: return "LVM_GETITEMTEXTW";
4511 case 0x1000 + 46: return "LVM_SETITEMTEXTA";
4512 case 0x1000 + 116: return "LVM_SETITEMTEXTW";
4513 case 0x1000 + 47: return "LVM_SETITEMCOUNT";
4514 case 0x1000 + 48: return "LVM_SORTITEMS";
4515 case 0x1000 + 49: return "LVM_SETITEMPOSITION32";
4516 case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT";
4517 case 0x1000 + 51: return "LVM_GETITEMSPACING";
4518 case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA";
4519 case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW";
4520 case 0x1000 + 53: return "LVM_SETICONSPACING";
4521 case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE";
4522 case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE";
4523 case 0x1000 + 56: return "LVM_GETSUBITEMRECT";
4524 case 0x1000 + 57: return "LVM_SUBITEMHITTEST";
4525 case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY";
4526 case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY";
4527 case 0x1000 + 60: return "LVM_SETHOTITEM";
4528 case 0x1000 + 61: return "LVM_GETHOTITEM";
4529 case 0x1000 + 62: return "LVM_SETHOTCURSOR";
4530 case 0x1000 + 63: return "LVM_GETHOTCURSOR";
4531 case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT";
4532 case 0x1000 + 65: return "LVM_SETWORKAREA";
4533
4534 // tree view
4535 case 0x1100 + 0: return "TVM_INSERTITEMA";
4536 case 0x1100 + 50: return "TVM_INSERTITEMW";
4537 case 0x1100 + 1: return "TVM_DELETEITEM";
4538 case 0x1100 + 2: return "TVM_EXPAND";
4539 case 0x1100 + 4: return "TVM_GETITEMRECT";
4540 case 0x1100 + 5: return "TVM_GETCOUNT";
4541 case 0x1100 + 6: return "TVM_GETINDENT";
4542 case 0x1100 + 7: return "TVM_SETINDENT";
4543 case 0x1100 + 8: return "TVM_GETIMAGELIST";
4544 case 0x1100 + 9: return "TVM_SETIMAGELIST";
4545 case 0x1100 + 10: return "TVM_GETNEXTITEM";
4546 case 0x1100 + 11: return "TVM_SELECTITEM";
4547 case 0x1100 + 12: return "TVM_GETITEMA";
4548 case 0x1100 + 62: return "TVM_GETITEMW";
4549 case 0x1100 + 13: return "TVM_SETITEMA";
4550 case 0x1100 + 63: return "TVM_SETITEMW";
4551 case 0x1100 + 14: return "TVM_EDITLABELA";
4552 case 0x1100 + 65: return "TVM_EDITLABELW";
4553 case 0x1100 + 15: return "TVM_GETEDITCONTROL";
4554 case 0x1100 + 16: return "TVM_GETVISIBLECOUNT";
4555 case 0x1100 + 17: return "TVM_HITTEST";
4556 case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE";
4557 case 0x1100 + 19: return "TVM_SORTCHILDREN";
4558 case 0x1100 + 20: return "TVM_ENSUREVISIBLE";
4559 case 0x1100 + 21: return "TVM_SORTCHILDRENCB";
4560 case 0x1100 + 22: return "TVM_ENDEDITLABELNOW";
4561 case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA";
4562 case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW";
4563 case 0x1100 + 24: return "TVM_SETTOOLTIPS";
4564 case 0x1100 + 25: return "TVM_GETTOOLTIPS";
4565
4566 // header
4567 case 0x1200 + 0: return "HDM_GETITEMCOUNT";
4568 case 0x1200 + 1: return "HDM_INSERTITEMA";
4569 case 0x1200 + 10: return "HDM_INSERTITEMW";
4570 case 0x1200 + 2: return "HDM_DELETEITEM";
4571 case 0x1200 + 3: return "HDM_GETITEMA";
4572 case 0x1200 + 11: return "HDM_GETITEMW";
4573 case 0x1200 + 4: return "HDM_SETITEMA";
4574 case 0x1200 + 12: return "HDM_SETITEMW";
4575 case 0x1200 + 5: return "HDM_LAYOUT";
4576 case 0x1200 + 6: return "HDM_HITTEST";
4577 case 0x1200 + 7: return "HDM_GETITEMRECT";
4578 case 0x1200 + 8: return "HDM_SETIMAGELIST";
4579 case 0x1200 + 9: return "HDM_GETIMAGELIST";
4580 case 0x1200 + 15: return "HDM_ORDERTOINDEX";
4581 case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE";
4582 case 0x1200 + 17: return "HDM_GETORDERARRAY";
4583 case 0x1200 + 18: return "HDM_SETORDERARRAY";
4584 case 0x1200 + 19: return "HDM_SETHOTDIVIDER";
4585
4586 // tab control
4587 case 0x1300 + 2: return "TCM_GETIMAGELIST";
4588 case 0x1300 + 3: return "TCM_SETIMAGELIST";
4589 case 0x1300 + 4: return "TCM_GETITEMCOUNT";
4590 case 0x1300 + 5: return "TCM_GETITEMA";
4591 case 0x1300 + 60: return "TCM_GETITEMW";
4592 case 0x1300 + 6: return "TCM_SETITEMA";
4593 case 0x1300 + 61: return "TCM_SETITEMW";
4594 case 0x1300 + 7: return "TCM_INSERTITEMA";
4595 case 0x1300 + 62: return "TCM_INSERTITEMW";
4596 case 0x1300 + 8: return "TCM_DELETEITEM";
4597 case 0x1300 + 9: return "TCM_DELETEALLITEMS";
4598 case 0x1300 + 10: return "TCM_GETITEMRECT";
4599 case 0x1300 + 11: return "TCM_GETCURSEL";
4600 case 0x1300 + 12: return "TCM_SETCURSEL";
4601 case 0x1300 + 13: return "TCM_HITTEST";
4602 case 0x1300 + 14: return "TCM_SETITEMEXTRA";
4603 case 0x1300 + 40: return "TCM_ADJUSTRECT";
4604 case 0x1300 + 41: return "TCM_SETITEMSIZE";
4605 case 0x1300 + 42: return "TCM_REMOVEIMAGE";
4606 case 0x1300 + 43: return "TCM_SETPADDING";
4607 case 0x1300 + 44: return "TCM_GETROWCOUNT";
4608 case 0x1300 + 45: return "TCM_GETTOOLTIPS";
4609 case 0x1300 + 46: return "TCM_SETTOOLTIPS";
4610 case 0x1300 + 47: return "TCM_GETCURFOCUS";
4611 case 0x1300 + 48: return "TCM_SETCURFOCUS";
4612 case 0x1300 + 49: return "TCM_SETMINTABWIDTH";
4613 case 0x1300 + 50: return "TCM_DESELECTALL";
4614
4615 // toolbar
61243a51
DW
4616 case WM_USER+1000+1: return "TB_ENABLEBUTTON";
4617 case WM_USER+1000+2: return "TB_CHECKBUTTON";
4618 case WM_USER+1000+3: return "TB_PRESSBUTTON";
4619 case WM_USER+1000+4: return "TB_HIDEBUTTON";
4620 case WM_USER+1000+5: return "TB_INDETERMINATE";
4621 case WM_USER+1000+9: return "TB_ISBUTTONENABLED";
4622 case WM_USER+1000+10: return "TB_ISBUTTONCHECKED";
4623 case WM_USER+1000+11: return "TB_ISBUTTONPRESSED";
4624 case WM_USER+1000+12: return "TB_ISBUTTONHIDDEN";
4625 case WM_USER+1000+13: return "TB_ISBUTTONINDETERMINATE";
4626 case WM_USER+1000+17: return "TB_SETSTATE";
4627 case WM_USER+1000+18: return "TB_GETSTATE";
4628 case WM_USER+1000+19: return "TB_ADDBITMAP";
4629 case WM_USER+1000+20: return "TB_ADDBUTTONS";
4630 case WM_USER+1000+21: return "TB_INSERTBUTTON";
4631 case WM_USER+1000+22: return "TB_DELETEBUTTON";
4632 case WM_USER+1000+23: return "TB_GETBUTTON";
4633 case WM_USER+1000+24: return "TB_BUTTONCOUNT";
4634 case WM_USER+1000+25: return "TB_COMMANDTOINDEX";
4635 case WM_USER+1000+26: return "TB_SAVERESTOREA";
4636 case WM_USER+1000+76: return "TB_SAVERESTOREW";
4637 case WM_USER+1000+27: return "TB_CUSTOMIZE";
4638 case WM_USER+1000+28: return "TB_ADDSTRINGA";
4639 case WM_USER+1000+77: return "TB_ADDSTRINGW";
4640 case WM_USER+1000+29: return "TB_GETITEMRECT";
4641 case WM_USER+1000+30: return "TB_BUTTONSTRUCTSIZE";
4642 case WM_USER+1000+31: return "TB_SETBUTTONSIZE";
4643 case WM_USER+1000+32: return "TB_SETBITMAPSIZE";
4644 case WM_USER+1000+33: return "TB_AUTOSIZE";
4645 case WM_USER+1000+35: return "TB_GETTOOLTIPS";
4646 case WM_USER+1000+36: return "TB_SETTOOLTIPS";
4647 case WM_USER+1000+37: return "TB_SETPARENT";
4648 case WM_USER+1000+39: return "TB_SETROWS";
4649 case WM_USER+1000+40: return "TB_GETROWS";
4650 case WM_USER+1000+42: return "TB_SETCMDID";
4651 case WM_USER+1000+43: return "TB_CHANGEBITMAP";
4652 case WM_USER+1000+44: return "TB_GETBITMAP";
4653 case WM_USER+1000+45: return "TB_GETBUTTONTEXTA";
4654 case WM_USER+1000+75: return "TB_GETBUTTONTEXTW";
4655 case WM_USER+1000+46: return "TB_REPLACEBITMAP";
4656 case WM_USER+1000+47: return "TB_SETINDENT";
4657 case WM_USER+1000+48: return "TB_SETIMAGELIST";
4658 case WM_USER+1000+49: return "TB_GETIMAGELIST";
4659 case WM_USER+1000+50: return "TB_LOADIMAGES";
4660 case WM_USER+1000+51: return "TB_GETRECT";
4661 case WM_USER+1000+52: return "TB_SETHOTIMAGELIST";
4662 case WM_USER+1000+53: return "TB_GETHOTIMAGELIST";
4663 case WM_USER+1000+54: return "TB_SETDISABLEDIMAGELIST";
4664 case WM_USER+1000+55: return "TB_GETDISABLEDIMAGELIST";
4665 case WM_USER+1000+56: return "TB_SETSTYLE";
4666 case WM_USER+1000+57: return "TB_GETSTYLE";
4667 case WM_USER+1000+58: return "TB_GETBUTTONSIZE";
4668 case WM_USER+1000+59: return "TB_SETBUTTONWIDTH";
4669 case WM_USER+1000+60: return "TB_SETMAXTEXTROWS";
4670 case WM_USER+1000+61: return "TB_GETTEXTROWS";
4671 case WM_USER+1000+41: return "TB_GETBITMAPFLAGS";
cdf1e714
DW
4672
4673 default:
4674 static char s_szBuf[128];
61243a51 4675 sprintf(s_szBuf, "<unknown message = %d>", nMessage);
cdf1e714 4676 return s_szBuf;
86de7616 4677 }
cdf1e714 4678 return NULL;
61243a51 4679} // end of wxGetMessageName
86de7616 4680
11e59d47
DW
4681#endif // __WXDEBUG__
4682
19193a2c
KB
4683// Unused?
4684#if 0
61243a51
DW
4685static void TranslateKbdEventToMouse(
4686 wxWindow* pWin
4687, int* pX
4688, int* pY
4689, ULONG* pFlags
4690)
4691{
4692 //
4693 // Construct the key mask
4694 ULONG& fwKeys = *pFlags;
4695
4696 fwKeys = VK_BUTTON2;
4697 if ((::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x100) != 0)
4698 fwKeys |= VK_CTRL;
4699 if ((::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x100) != 0)
4700 fwKeys |= VK_SHIFT;
4701
4702 //
4703 // Simulate right mouse button click
4704 //
4705 POINTL vPoint;
4706
4707 ::WinQueryMsgPos(vHabmain, &vPoint);
4708 *pX = vPoint.x;
4709 *pY = vPoint.y;
4710
4711 pWin->ScreenToClient(pX, pY);
4712} // end of TranslateKbdEventToMouse
19193a2c 4713#endif
61243a51 4714
cd212ee4
DW
4715// Find the wxWindow at the current mouse position, returning the mouse
4716// position.
f44fdfb0 4717wxWindow* wxFindWindowAtPointer(
19193a2c 4718 wxPoint& WXUNUSED(rPt)
f44fdfb0 4719)
cd212ee4
DW
4720{
4721 return wxFindWindowAtPoint(wxGetMousePosition());
4722}
4723
f44fdfb0
DW
4724wxWindow* wxFindWindowAtPoint(
4725 const wxPoint& rPt
4726)
cd212ee4 4727{
f44fdfb0 4728 POINTL vPt2;
cd212ee4 4729
f44fdfb0
DW
4730 vPt2.x = rPt.x;
4731 vPt2.y = rPt.y;
cd212ee4 4732
f44fdfb0
DW
4733 HWND hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE);
4734 wxWindow* pWin = wxFindWinFromHandle((WXHWND)hWndHit) ;
4735 HWND hWnd = hWndHit;
4736
4737 //
cd212ee4 4738 // Try to find a window with a wxWindow associated with it
f44fdfb0
DW
4739 //
4740 while (!pWin && (hWnd != 0))
cd212ee4 4741 {
f44fdfb0
DW
4742 hWnd = ::WinQueryWindow(hWnd, QW_PARENT);
4743 pWin = wxFindWinFromHandle((WXHWND)hWnd) ;
cd212ee4 4744 }
f44fdfb0 4745 return pWin;
cd212ee4
DW
4746}
4747
f44fdfb0
DW
4748// Get the current mouse position.
4749wxPoint wxGetMousePosition()
4750{
4751 POINTL vPt;
4752
4753 ::WinQueryPointerPos(HWND_DESKTOP, &vPt);
4754 return wxPoint(vPt.x, vPt.y);
4755}
cd212ee4 4756