]> git.saurik.com Git - wxWidgets.git/blame - src/os2/window.cpp
minor wxMGL fixes -- controls sample is now OK
[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
DW
1412 HWND hWnd = GetHwnd();
1413 RECT vRect;
1414 POINTL vPoint;
c86c44a0 1415
a7ef993c 1416 ::WinQueryWindowRect(hWnd, &vRect);
c86c44a0 1417
a7ef993c
DW
1418 vPoint.x = vRect.xLeft;
1419 vPoint.y = vRect.yBottom;
c86c44a0 1420
a7ef993c
DW
1421 //
1422 // We do the adjustments with respect to the parent only for the "real"
c86c44a0 1423 // children, not for the dialogs/frames
a7ef993c
DW
1424 //
1425 if (!IsTopLevel())
c86c44a0 1426 {
a7ef993c
DW
1427 HWND hParentWnd = 0;
1428 wxWindow* pParent = GetParent();
1429
1430 if (pParent)
1431 hParentWnd = GetWinHwnd(pParent);
c86c44a0 1432
a7ef993c 1433 //
c86c44a0 1434 // Since we now have the absolute screen coords, if there's a parent we
a7ef993c
DW
1435 // must subtract its bottom left corner
1436 //
1437 if (hParentWnd)
c86c44a0 1438 {
a7ef993c
DW
1439 RECTL vRect2;
1440
542875a8 1441 ::WinQueryWindowRect(hParentWnd, &vRect2);
a7ef993c
DW
1442 vPoint.x -= vRect.xLeft;
1443 vPoint.y -= vRect.yBottom;
c86c44a0
DW
1444 }
1445
a7ef993c 1446 //
c86c44a0
DW
1447 // We may be faking the client origin. So a window that's really at (0,
1448 // 30) may appear (to wxWin apps) to be at (0, 0).
a7ef993c 1449 //
19193a2c
KB
1450 if (pParent) {
1451 wxPoint vPt(pParent->GetClientAreaOrigin());
a7ef993c 1452
19193a2c
KB
1453 vPoint.x -= vPt.x;
1454 vPoint.y -= vPt.y;
1455 }
c86c44a0
DW
1456 }
1457
a7ef993c
DW
1458 if (pX)
1459 *pX = vPoint.x;
542875a8 1460 if (pY)
a7ef993c 1461 *pY = vPoint.y;
0367c1c0 1462} // end of wxWindowOS2::DoGetPosition
cdf1e714 1463
0367c1c0 1464void wxWindowOS2::DoScreenToClient(
a7ef993c
DW
1465 int* pX
1466, int* pY
1467) const
cdf1e714 1468{
a7ef993c 1469 HWND hWnd = GetHwnd();
19193a2c
KB
1470 POINTL ptl;
1471
1472 ptl.x = pX ? *pX : 0;
1473 ptl.y = pY ? *pY : 0;
542875a8 1474
19193a2c 1475 ::WinMapWindowPoints(HWND_DESKTOP, hWnd, &ptl, 1);
cdf1e714 1476
a7ef993c 1477 if (pX)
19193a2c 1478 *pX = ptl.x;
a7ef993c 1479 if (pY)
19193a2c
KB
1480 *pY = ptl.y;
1481
0367c1c0 1482} // end of wxWindowOS2::DoScreenToClient
a7ef993c 1483
0367c1c0 1484void wxWindowOS2::DoClientToScreen(
a7ef993c
DW
1485 int* pX
1486, int* pY
1487) const
cdf1e714 1488{
a7ef993c 1489 HWND hWnd = GetHwnd();
19193a2c 1490 POINTL ptl;
c86c44a0 1491
19193a2c
KB
1492 ptl.x = pX ? *pX : 0;
1493 ptl.y = pY ? *pY : 0;
1494
1495 ::WinMapWindowPoints(hWnd, HWND_DESKTOP, &ptl, 1);
c86c44a0 1496
a7ef993c 1497 if (pX)
19193a2c 1498 *pX = ptl.x;
a7ef993c 1499 if (pY)
19193a2c 1500 *pY = ptl.y;
0367c1c0 1501} // end of wxWindowOS2::DoClientToScreen
cdf1e714 1502
a7ef993c 1503//
cdf1e714 1504// Get size *available for subwindows* i.e. excluding menu bar etc.
a7ef993c
DW
1505// Must be a frame type window
1506//
0367c1c0 1507void wxWindowOS2::DoGetClientSize(
a7ef993c
DW
1508 int* pWidth
1509, int* pHeight
1510) const
cdf1e714 1511{
a7ef993c
DW
1512 HWND hWnd = GetHwnd();
1513 HWND hWndClient;
1514 RECTL vRect;
1515
833615dd
DW
1516 if (IsKindOf(CLASSINFO(wxFrame)))
1517 hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
1518 else
1519 hWndClient = NULLHANDLE;
51c1d535
DW
1520 if( hWndClient == NULLHANDLE)
1521 ::WinQueryWindowRect(GetHwnd(), &vRect);
1522 else
1523 ::WinQueryWindowRect(hWndClient, &vRect);
a7ef993c 1524
542875a8 1525 if (pWidth)
a7ef993c 1526 *pWidth = vRect.xRight;
542875a8 1527 if (pHeight)
a7ef993c 1528 *pHeight = vRect.yTop;
0367c1c0 1529} // end of wxWindowOS2::DoGetClientSize
cdf1e714 1530
0367c1c0 1531void wxWindowOS2::DoMoveWindow(
a7ef993c
DW
1532 int nX
1533, int nY
1534, int nWidth
1535, int nHeight
1536)
cdf1e714 1537{
39c26ef2
DW
1538 RECTL vRect;
1539 HWND hParent;
1540 wxWindow* pParent = GetParent();
1541
1542 if (pParent)
987da0d4 1543 {
39c26ef2 1544 hParent = GetWinHwnd(pParent);
987da0d4
DW
1545 if (pParent->IsKindOf(CLASSINFO(wxFrame)))
1546 {
1547 if (IsKindOf(CLASSINFO(wxStatusBar)) ||
1548 IsKindOf(CLASSINFO(wxMenuBar)) ||
1549 IsKindOf(CLASSINFO(wxToolBar))
1550 )
1551 nY = pParent->GetSize().y - (nY + nHeight);
1552 else
1553 nY = pParent->GetClientSize().y - (nY + nHeight);
1554 }
1555 else
1556 nY = pParent->GetSize().y - (nY + nHeight);
1557 }
39c26ef2 1558 else
c86c44a0 1559 {
987da0d4
DW
1560 RECTL vRect;
1561
1562 ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
1563 nY = vRect.yTop - (nY + nHeight);
1564 }
1565 ::WinSetWindowPos( GetHwnd()
1566 ,HWND_TOP
1567 ,(LONG)nX
1568 ,(LONG)nY
1569 ,(LONG)nWidth
1570 ,(LONG)nHeight
1571 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
1572 );
0367c1c0 1573} // end of wxWindowOS2::DoMoveWindow
cdf1e714 1574
c86c44a0
DW
1575//
1576// Set the size of the window: if the dimensions are positive, just use them,
cdf1e714
DW
1577// but if any of them is equal to -1, it means that we must find the value for
1578// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1579// which case -1 is a valid value for x and y)
1580//
1581// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1582// the width/height to best suit our contents, otherwise we reuse the current
1583// width/height
c86c44a0 1584//
0367c1c0 1585void wxWindowOS2::DoSetSize(
a7ef993c
DW
1586 int nX
1587, int nY
1588, int nWidth
1589, int nHeight
1590, int nSizeFlags
1591)
cdf1e714 1592{
a7ef993c
DW
1593 //
1594 // Get the current size and position...
1595 //
1596 int nCurrentX;
1597 int nCurrentY;
1598 int nCurrentWidth;
1599 int nCurrentHeight;
542875a8 1600 wxSize vSize(-1, -1);
a7ef993c 1601
19193a2c
KB
1602 GetPosition(&nCurrentX, &nCurrentY);
1603 GetSize(&nCurrentWidth, &nCurrentHeight);
c86c44a0
DW
1604
1605 // ... and don't do anything (avoiding flicker) if it's already ok
19193a2c
KB
1606 if (nX == nCurrentX && nY == nCurrentY &&
1607 nWidth == nCurrentWidth && nHeight == nCurrentHeight)
c86c44a0
DW
1608 {
1609 return;
1610 }
1611
a7ef993c
DW
1612 if (nX == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
1613 nX = nCurrentX;
542875a8 1614 if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
a7ef993c 1615 nY = nCurrentY;
c86c44a0 1616
19193a2c 1617 AdjustForParentClientOrigin(nX, nY, nSizeFlags);
c86c44a0 1618
a7ef993c 1619 if (nWidth == -1)
c86c44a0 1620 {
a7ef993c 1621 if (nSizeFlags & wxSIZE_AUTO_WIDTH)
c86c44a0 1622 {
a7ef993c
DW
1623 vSize = DoGetBestSize();
1624 nWidth = vSize.x;
c86c44a0
DW
1625 }
1626 else
1627 {
a7ef993c
DW
1628 //
1629 // Just take the current one
1630 //
1631 nWidth = nCurrentWidth;
c86c44a0
DW
1632 }
1633 }
1634
a7ef993c 1635 if (nHeight == -1)
c86c44a0 1636 {
a7ef993c 1637 if (nSizeFlags & wxSIZE_AUTO_HEIGHT)
c86c44a0 1638 {
a7ef993c 1639 if (vSize.x == -1)
c86c44a0 1640 {
a7ef993c 1641 vSize = DoGetBestSize();
c86c44a0 1642 }
a7ef993c 1643 nHeight = vSize.y;
c86c44a0
DW
1644 }
1645 else
1646 {
1647 // just take the current one
a7ef993c 1648 nHeight = nCurrentHeight;
c86c44a0
DW
1649 }
1650 }
1651
a7ef993c
DW
1652 DoMoveWindow( nX
1653 ,nY
1654 ,nWidth
1655 ,nHeight
1656 );
0367c1c0 1657} // end of wxWindowOS2::DoSetSize
cdf1e714 1658
0367c1c0 1659void wxWindowOS2::DoSetClientSize(
a7ef993c
DW
1660 int nWidth
1661, int nHeight
1662)
cdf1e714 1663{
a7ef993c
DW
1664 wxWindow* pParent = GetParent();
1665 HWND hWnd = GetHwnd();
19193a2c 1666#if 0
a7ef993c
DW
1667 HWND hParentWnd = (HWND)0;
1668 HWND hClientWnd = (HWND)0;
1669 RECTL vRect;
1670 RECT vRect2;
1671 RECT vRect3;
c86c44a0 1672
542875a8 1673 hClientWnd = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
a7ef993c 1674 ::WinQueryWindowRect(hClientWnd, &vRect2);
c86c44a0 1675
a7ef993c
DW
1676 if (pParent)
1677 hParentWnd = (HWND) pParent->GetHWND();
c86c44a0 1678
a7ef993c
DW
1679 ::WinQueryWindowRect(hWnd, &vRect);
1680 ::WinQueryWindowRect(hParentWnd, &vRect3);
1681 //
c86c44a0
DW
1682 // Find the difference between the entire window (title bar and all)
1683 // and the client area; add this to the new client size to move the
a7ef993c
DW
1684 // window. OS/2 is backward from windows on height
1685 //
1686 int nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth;
1687 int nActualHeight = vRect2.yTop - vRect2.yBottom - vRect.yTop + nHeight;
c86c44a0 1688
a7ef993c
DW
1689 //
1690 // If there's a parent, must subtract the parent's bottom left corner
c86c44a0 1691 // since MoveWindow moves relative to the parent
a7ef993c
DW
1692 //
1693 POINTL vPoint;
c86c44a0 1694
a7ef993c
DW
1695 vPoint.x = vRect2.xLeft;
1696 vPoint.y = vRect2.yBottom;
1697 if (pParent)
19193a2c 1698 { x
a7ef993c 1699 vPoint.x -= vRect3.xLeft;
542875a8 1700 vPoint.y -= vRect3.yBottom;
c86c44a0 1701 }
19193a2c
KB
1702#else
1703 HWND hParentWnd = (HWND)0;
1704 HWND hClientWnd = (HWND)0;
1705 RECTL vRect;
1706 RECT vRect2;
c86c44a0 1707
19193a2c
KB
1708 hClientWnd = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
1709 ::WinQueryWindowRect(hClientWnd, &vRect2);
1710 ::WinQueryWindowRect(hWnd, &vRect2);
c86c44a0 1711
19193a2c
KB
1712 if (pParent)
1713 hParentWnd = (HWND) pParent->GetHWND();
a7ef993c 1714
19193a2c
KB
1715 ::WinQueryWindowRect(hWnd, &vRect);
1716 //
1717 // Find the difference between the entire window (title bar and all)
1718 // and the client area; add this to the new client size to move the
1719 // window. OS/2 is backward from windows on height
1720 //
1721 int nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth;
1722 int nActualHeight = vRect2.yTop - vRect2.yBottom - vRect.yTop + nHeight;
1723
1724 nActualWidth = nWidth;
1725 nActualHeight = nHeight;
1726 //
1727 // If there's a parent, must subtract the parent's bottom left corner
1728 // since MoveWindow moves relative to the parent
1729 //
1730 POINTL vPoint;
1731
1732 vPoint.x = vRect2.xLeft;
1733 vPoint.y = vRect2.yBottom;
1734 if (pParent)
1735 {
1736 ::WinMapWindowPoints(hWnd, hParentWnd, &vPoint, 1);
1737 }
1738#endif
1739
1740 DoMoveWindow(vPoint.x, vPoint.y, nActualWidth, nActualHeight);
1741
1742 wxSizeEvent vEvent(wxSize(nWidth, nHeight), m_windowId);
a7ef993c
DW
1743 vEvent.SetEventObject(this);
1744 GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 1745} // end of wxWindowOS2::DoSetClientSize
cdf1e714 1746
0367c1c0 1747wxPoint wxWindowOS2::GetClientAreaOrigin() const
cdf1e714
DW
1748{
1749 return wxPoint(0, 0);
0367c1c0 1750} // end of wxWindowOS2::GetClientAreaOrigin
cdf1e714 1751
cdf1e714
DW
1752// ---------------------------------------------------------------------------
1753// text metrics
1754// ---------------------------------------------------------------------------
1755
0367c1c0 1756int wxWindowOS2::GetCharHeight() const
cdf1e714 1757{
a7ef993c
DW
1758 HPS hPs;
1759 FONTMETRICS vFontMetrics;
cdf1e714 1760
a7ef993c
DW
1761 hPs = ::WinGetPS(GetHwnd());
1762
542875a8 1763 if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics))
b7084589
DW
1764 {
1765 ::WinReleasePS(hPs);
a7ef993c 1766 return (0);
b7084589 1767 }
a7ef993c 1768 ::WinReleasePS(hPs);
b7084589 1769 return(vFontMetrics.lMaxAscender + vFontMetrics.lMaxDescender);
0367c1c0 1770} // end of wxWindowOS2::GetCharHeight
a7ef993c 1771
0367c1c0 1772int wxWindowOS2::GetCharWidth() const
cdf1e714 1773{
542875a8
DW
1774 HPS hPs;
1775 FONTMETRICS vFontMetrics;
1776
a7ef993c 1777 hPs = ::WinGetPS(GetHwnd());
cdf1e714 1778
542875a8 1779 if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics))
b7084589
DW
1780 {
1781 ::WinReleasePS(hPs);
a7ef993c 1782 return (0);
b7084589 1783 }
a7ef993c 1784 ::WinReleasePS(hPs);
b7084589 1785 return(vFontMetrics.lAveCharWidth);
0367c1c0 1786} // end of wxWindowOS2::GetCharWidth
a7ef993c 1787
0367c1c0 1788void wxWindowOS2::GetTextExtent(
a7ef993c
DW
1789 const wxString& rString
1790, int* pX
1791, int* pY
1792, int* pDescent
1793, int* pExternalLeading
1794, const wxFont* pTheFont
1795) const
cdf1e714 1796{
987da0d4
DW
1797 POINTL avPoint[TXTBOX_COUNT];
1798 POINTL vPtMin;
1799 POINTL vPtMax;
1800 int i;
1801 int l;
1802 FONTMETRICS vFM; // metrics structure
1803 BOOL bRc;
1804 char* pStr;
1805 ERRORID vErrorCode; // last error id code
1806 HPS hPS;
19193a2c 1807
a7ef993c 1808
987da0d4 1809 hPS = ::WinGetPS(GetHwnd());
a7ef993c 1810
987da0d4
DW
1811 l = rString.Length();
1812 if (l > 0L)
1813 {
1814 pStr = (PCH)rString.c_str();
a7ef993c 1815
987da0d4
DW
1816 //
1817 // In world coordinates.
1818 //
1819 bRc = ::GpiQueryTextBox( hPS
1820 ,l
1821 ,pStr
1822 ,TXTBOX_COUNT // return maximum information
1823 ,avPoint // array of coordinates points
1824 );
1825 if (bRc)
1826 {
1827 vPtMin.x = avPoint[0].x;
1828 vPtMax.x = avPoint[0].x;
1829 vPtMin.y = avPoint[0].y;
1830 vPtMax.y = avPoint[0].y;
1831 for (i = 1; i < 4; i++)
1832 {
1833 if(vPtMin.x > avPoint[i].x) vPtMin.x = avPoint[i].x;
1834 if(vPtMin.y > avPoint[i].y) vPtMin.y = avPoint[i].y;
1835 if(vPtMax.x < avPoint[i].x) vPtMax.x = avPoint[i].x;
1836 if(vPtMax.y < avPoint[i].y) vPtMax.y = avPoint[i].y;
1837 }
1838 bRc = ::GpiQueryFontMetrics( hPS
1839 ,sizeof(FONTMETRICS)
1840 ,&vFM
1841 );
1842 if (!bRc)
1843 {
1844 vPtMin.x = 0;
1845 vPtMin.y = 0;
1846 vPtMax.x = 0;
1847 vPtMax.y = 0;
1848 }
1849 }
1850 else
1851 {
1852 vPtMin.x = 0;
1853 vPtMin.y = 0;
1854 vPtMax.x = 0;
1855 vPtMax.y = 0;
1856 }
1857 }
1858 else
a7ef993c 1859 {
987da0d4
DW
1860 vPtMin.x = 0;
1861 vPtMin.y = 0;
1862 vPtMax.x = 0;
1863 vPtMax.y = 0;
a7ef993c 1864 }
987da0d4
DW
1865 if (pX)
1866 *pX = (vPtMax.x - vPtMin.x + 1);
1867 if (pY)
1868 *pY = (vPtMax.y - vPtMin.y + 1);
1869 if (pDescent)
1870 {
1871 if (bRc)
1872 *pDescent = vFM.lMaxDescender;
1873 else
1874 *pDescent = 0;
1875 }
1876 if (pExternalLeading)
1877 {
1878 if (bRc)
1879 *pExternalLeading = vFM.lExternalLeading;
1880 else
1881 *pExternalLeading = 0;
1882 }
1883 ::WinReleasePS(hPS);
1884} // end of wxWindow::GetTextExtent
cdf1e714
DW
1885
1886#if wxUSE_CARET && WXWIN_COMPATIBILITY
1887// ---------------------------------------------------------------------------
1888// Caret manipulation
1889// ---------------------------------------------------------------------------
1890
0367c1c0 1891void wxWindowOS2::CreateCaret(
a7ef993c
DW
1892 int nWidth
1893, int nHeight
1894)
cdf1e714 1895{
a7ef993c
DW
1896 SetCaret(new wxCaret( this
1897 ,nWidth
1898 ,nHeight
1899 ));
0367c1c0 1900} // end of wxWindowOS2::CreateCaret
a7ef993c 1901
0367c1c0 1902void wxWindowOS2::CreateCaret(
a7ef993c
DW
1903 const wxBitmap* pBitmap
1904)
cdf1e714 1905{
a7ef993c 1906 wxFAIL_MSG("not implemented");
0367c1c0 1907} // end of wxWindowOS2::CreateCaret
cdf1e714 1908
0367c1c0 1909void wxWindowOS2::ShowCaret(
a7ef993c
DW
1910 bool bShow
1911)
cdf1e714 1912{
a7ef993c
DW
1913 wxCHECK_RET( m_caret, "no caret to show" );
1914
1915 m_caret->Show(bShow);
0367c1c0 1916} // end of wxWindowOS2::ShowCaret
cdf1e714 1917
0367c1c0 1918void wxWindowOS2::DestroyCaret()
cdf1e714 1919{
a7ef993c 1920 SetCaret(NULL);
0367c1c0 1921} // end of wxWindowOS2::DestroyCaret
cdf1e714 1922
0367c1c0 1923void wxWindowOS2::SetCaretPos(
a7ef993c
DW
1924 int nX
1925, int nY)
cdf1e714 1926{
a7ef993c
DW
1927 wxCHECK_RET( m_caret, "no caret to move" );
1928
1929 m_caret->Move( nX
1930 ,nY
1931 );
0367c1c0 1932} // end of wxWindowOS2::SetCaretPos
cdf1e714 1933
0367c1c0 1934void wxWindowOS2::GetCaretPos(
a7ef993c
DW
1935 int* pX
1936, int* pY
1937) const
cdf1e714 1938{
a7ef993c
DW
1939 wxCHECK_RET( m_caret, "no caret to get position of" );
1940
1941 m_caret->GetPosition( pX
1942 ,pY
1943 );
0367c1c0 1944} // end of wxWindowOS2::GetCaretPos
cdf1e714
DW
1945
1946#endif //wxUSE_CARET
1947
1948// ---------------------------------------------------------------------------
1949// popup menu
1950// ---------------------------------------------------------------------------
19193a2c
KB
1951//
1952#if wxUSE_MENUS_NATIVE
3febf684
DW
1953static void wxYieldForCommandsOnly()
1954{
1955 //
1956 // Peek all WM_COMMANDs (it will always return WM_QUIT too but we don't
1957 // want to process it here)
1958 //
1959 QMSG vMsg;
1960
19193a2c
KB
1961 while (::WinPeekMsg(vHabmain, &vMsg, (HWND)0, WM_COMMAND,
1962 WM_COMMAND,PM_REMOVE) && vMsg.msg != WM_QUIT)
3febf684
DW
1963 {
1964 wxTheApp->DoMessage((WXMSG*)&vMsg);
1965 }
1966}
19193a2c 1967#endif // wxUSE_MENUS_NATIVE
3febf684 1968
19193a2c 1969#if wxUSE_MENUS_NATIVE
0367c1c0 1970bool wxWindowOS2::DoPopupMenu(
61243a51
DW
1971 wxMenu* pMenu
1972, int nX
1973, int nY
1974)
cdf1e714 1975{
61243a51
DW
1976 HWND hWnd = GetHwnd();
1977 HWND hWndParent = GetParent() ? GetWinHwnd(GetParent()) : (HWND)0;
1978 HWND hMenu = GetHmenuOf(pMenu);
1979
1980 pMenu->SetInvokingWindow(this);
1981 pMenu->UpdateUI();
1982
1983 DoClientToScreen( &nX
1984 ,&nY
1985 );
1986 wxCurrentPopupMenu = pMenu;
1987
1988 ::WinPopupMenu( hWndParent
1989 ,hWnd
1990 ,hMenu
1991 ,nX
1992 ,nY
1993 ,0L
1994 ,PU_MOUSEBUTTON2DOWN | PU_MOUSEBUTTON2 | PU_KEYBOARD
1995 );
3febf684 1996 // we need to do it righ now as otherwise the events are never going to be
19193a2c 1997 // sent to wxCurrentPopupMenu from ;()
3febf684
DW
1998 //
1999 // note that even eliminating (ugly) wxCurrentPopupMenu global wouldn't
2000 // help and we'd still need wxYieldForCommandsOnly() as the menu may be
2001 // destroyed as soon as we return (it can be a local variable in the caller
2002 // for example) and so we do need to process the event immediately
2003 wxYieldForCommandsOnly();
61243a51
DW
2004 wxCurrentPopupMenu = NULL;
2005
2006 pMenu->SetInvokingWindow(NULL);
2007 return TRUE;
0367c1c0 2008} // end of wxWindowOS2::DoPopupMenu
19193a2c 2009#endif // wxUSE_MENUS_NATIVE
cdf1e714
DW
2010
2011// ===========================================================================
2012// pre/post message processing
2013// ===========================================================================
2014
0367c1c0 2015MRESULT wxWindowOS2::OS2DefWindowProc(
61243a51
DW
2016 WXUINT uMsg
2017, WXWPARAM wParam
2018, WXLPARAM lParam
2019)
cdf1e714 2020{
61243a51 2021 if (m_fnOldWndProc)
19193a2c 2022 return (MRESULT)m_fnOldWndProc(GetHWND(), uMsg, (MPARAM)wParam, (MPARAM)lParam);
61243a51 2023 else
19193a2c 2024 return ::WinDefWindowProc(GetHWND(), uMsg, (MPARAM)wParam, (MPARAM)lParam);
0367c1c0 2025} // end of wxWindowOS2::OS2DefWindowProc
cdf1e714 2026
0367c1c0 2027bool wxWindowOS2::OS2ProcessMessage(
61243a51
DW
2028 WXMSG* pMsg
2029)
cdf1e714 2030{
19193a2c
KB
2031// wxUniversal implements tab traversal itself
2032#ifndef __WXUNIVERSAL__
61243a51
DW
2033 QMSG* pQMsg = (QMSG*)pMsg;
2034
2035 if (m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL))
2036 {
2037 //
2038 // Intercept dialog navigation keys
2039 //
2040 bool bProcess = TRUE;
2041 USHORT uKeyFlags = SHORT1FROMMP(pQMsg->mp1);
2042
2043 if (uKeyFlags & KC_KEYUP)
2044 bProcess = FALSE;
2045
2046 if (uKeyFlags & KC_ALT)
2047 bProcess = FALSE;
2048
2049 if (!(uKeyFlags & KC_VIRTUALKEY))
2050 bProcess = FALSE;
2051
2052 if (bProcess)
2053 {
2054 bool bCtrlDown = IsCtrlDown();
2055 bool bShiftDown = IsShiftDown();
2056
2057 //
2058 // WM_QUERYDLGCODE: ask the control if it wants the key for itself,
2059 // don't process it if it's the case (except for Ctrl-Tab/Enter
2060 // combinations which are always processed)
2061 //
2062 ULONG ulDlgCode = 0;
2063
2064 if (!bCtrlDown)
2065 {
2066 ulDlgCode = (ULONG)::WinSendMsg(pQMsg->hwnd, WM_QUERYDLGCODE, pQMsg, 0);
2067 }
2068
2069 bool bForward = TRUE;
2070 bool bWindowChange = FALSE;
2071
2072 switch (SHORT2FROMMP(pQMsg->mp2))
2073 {
2074 //
2075 // Going to make certain assumptions about specific types of controls
2076 // here, so we may have to alter some things later if they prove invalid
2077 //
2078 case VK_TAB:
2079 //
2080 // Shift tabl will always be a nav-key but tabs may be wanted
2081 //
2082 if (!bShiftDown)
2083 {
2084 bProcess = FALSE;
2085 }
2086 else
2087 {
2088 //
2089 // Entry Fields want tabs for themselve usually
2090 //
2091 switch (ulDlgCode)
2092 {
2093 case DLGC_ENTRYFIELD:
2094 case DLGC_MLE:
2095 bProcess = TRUE;
2096 break;
2097
2098 default:
2099 bProcess = FALSE;
2100 }
2101
2102 //
2103 // Ctrl-Tab cycles thru notebook pages
2104 //
2105 bWindowChange = bCtrlDown;
2106 bForward = !bShiftDown;
2107 }
2108 break;
2109
2110 case VK_UP:
2111 case VK_LEFT:
2112 if (bCtrlDown)
2113 bProcess = FALSE;
2114 else
2115 bForward = FALSE;
2116 break;
2117
2118 case VK_DOWN:
2119 case VK_RIGHT:
2120 if (bCtrlDown)
2121 bProcess = FALSE;
2122 break;
2123
2124 case VK_ENTER:
2125 {
2126 if (bCtrlDown)
2127 {
2128 //
2129 // ctrl-enter is not processed
2130 //
2131 return FALSE;
2132 }
2133 else if (ulDlgCode & DLGC_BUTTON)
2134 {
2135 //
2136 // buttons want process Enter themselevs
2137 //
2138 bProcess = FALSE;
2139 }
2140 else
2141 {
1bcfc0e1
DW
2142 wxButton* pBtn = wxDynamicCast( GetDefaultItem()
2143 ,wxButton
2144 );
61243a51
DW
2145
2146 if (pBtn && pBtn->IsEnabled())
2147 {
2148 //
2149 // If we do have a default button, do press it
2150 //
2151 pBtn->OS2Command(BN_CLICKED, 0 /* unused */);
2152 return TRUE;
2153 }
2154 // else: but if it does not it makes sense to make
2155 // it work like a TAB - and that's what we do.
2156 // Note that Ctrl-Enter always works this way.
2157 }
2158 }
2159 break;
2160
2161 default:
2162 bProcess = FALSE;
2163 }
2164
2165 if (bProcess)
2166 {
2167 wxNavigationKeyEvent vEvent;
2168
2169 vEvent.SetDirection(bForward);
2170 vEvent.SetWindowChange(bWindowChange);
2171 vEvent.SetEventObject(this);
2172
2173 if (GetEventHandler()->ProcessEvent(vEvent))
2174 {
2175 wxButton* pBtn = wxDynamicCast(FindFocus(), wxButton);
2176
2177 if (pBtn)
2178 {
2179 //
2180 // The button which has focus should be default
2181 //
2182 pBtn->SetDefault();
2183 }
2184 return TRUE;
2185 }
2186 }
2187 }
dae16775
DW
2188 //
2189 // Let Dialogs process
2190 //
2191 if (::WinSendMsg(pQMsg->hwnd, WM_QUERYDLGCODE, pQMsg, 0));
2192 return TRUE;
61243a51 2193 }
19193a2c
KB
2194#else
2195 pMsg = pMsg; // just shut up the compiler
2196#endif // __WXUNIVERSAL__
61243a51
DW
2197
2198#if wxUSE_TOOLTIPS
2199 if ( m_tooltip )
2200 {
2201 // relay mouse move events to the tooltip control
2202 QMSG* pQMsg = (QMSG*)pMsg;
2203
2204 if (pQMsg->msg == WM_MOUSEMOVE )
2205 m_tooltip->RelayEvent(pMsg);
2206 }
2207#endif // wxUSE_TOOLTIPS
2208
cdf1e714 2209 return FALSE;
0367c1c0 2210} // end of wxWindowOS2::OS2ProcessMessage
cdf1e714 2211
0367c1c0 2212bool wxWindowOS2::OS2TranslateMessage(
61243a51
DW
2213 WXMSG* pMsg
2214)
cdf1e714 2215{
19193a2c 2216#if wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
7e99520b
DW
2217 return m_acceleratorTable.Translate(m_hWnd, pMsg);
2218#else
19193a2c 2219 pMsg = pMsg;
7e99520b
DW
2220 return FALSE;
2221#endif //wxUSE_ACCEL
0367c1c0 2222} // end of wxWindowOS2::OS2TranslateMessage
cdf1e714
DW
2223
2224// ---------------------------------------------------------------------------
61243a51 2225// message params unpackers
cdf1e714
DW
2226// ---------------------------------------------------------------------------
2227
0367c1c0 2228void wxWindowOS2::UnpackCommand(
61243a51
DW
2229 WXWPARAM wParam
2230, WXLPARAM lParam
2231, WORD* pId
2232, WXHWND* phWnd
2233, WORD* pCmd
2234)
cdf1e714 2235{
5b3ed311
DW
2236 *pId = LOWORD(wParam);
2237 *phWnd = NULL; // or may be GetHWND() ?
2238 *pCmd = LOWORD(lParam);
0367c1c0 2239} // end of wxWindowOS2::UnpackCommand
cdf1e714 2240
0367c1c0 2241void wxWindowOS2::UnpackActivate(
61243a51
DW
2242 WXWPARAM wParam
2243, WXLPARAM lParam
2244, WXWORD* pState
2245, WXHWND* phWnd
2246)
cdf1e714 2247{
61243a51
DW
2248 *pState = LOWORD(wParam);
2249 *phWnd = (WXHWND)lParam;
0367c1c0 2250} // end of wxWindowOS2::UnpackActivate
cdf1e714 2251
0367c1c0 2252void wxWindowOS2::UnpackScroll(
61243a51
DW
2253 WXWPARAM wParam
2254, WXLPARAM lParam
2255, WXWORD* pCode
2256, WXWORD* pPos
2257, WXHWND* phWnd
2258)
cdf1e714 2259{
b7d8f285
DW
2260 ULONG ulId;
2261 HWND hWnd;
2262
2263 ulId = (ULONG)LONGFROMMP(wParam);
2264 hWnd = ::WinWindowFromID(GetHwnd(), ulId);
2265 if (hWnd == m_hWndScrollBarHorz || hWnd == m_hWndScrollBarVert)
2266 *phWnd = NULLHANDLE;
2267 else
2268 *phWnd = hWnd;
2269
2270 *pPos = SHORT1FROMMP(lParam);
2271 *pCode = SHORT2FROMMP(lParam);
0367c1c0 2272} // end of wxWindowOS2::UnpackScroll
61243a51 2273
0367c1c0 2274void wxWindowOS2::UnpackMenuSelect(
61243a51
DW
2275 WXWPARAM wParam
2276, WXLPARAM lParam
2277, WXWORD* pItem
2278, WXWORD* pFlags
2279, WXHMENU* phMenu
2280)
cdf1e714 2281{
61243a51
DW
2282 *pItem = (WXWORD)LOWORD(wParam);
2283 *pFlags = HIWORD(wParam);
2284 *phMenu = (WXHMENU)lParam;
0367c1c0 2285} // end of wxWindowOS2::UnpackMenuSelect
cdf1e714
DW
2286
2287// ---------------------------------------------------------------------------
2288// Main wxWindows window proc and the window proc for wxWindow
2289// ---------------------------------------------------------------------------
2290
61243a51 2291//
cdf1e714
DW
2292// Hook for new window just as it's being created, when the window isn't yet
2293// associated with the handle
61243a51 2294//
19193a2c 2295wxWindowOS2* wxWndHook = NULL;
cdf1e714 2296
61243a51 2297//
cdf1e714 2298// Main window proc
61243a51 2299//
f23208ca 2300MRESULT EXPENTRY wxWndProc(
61243a51
DW
2301 HWND hWnd
2302, ULONG ulMsg
2303, MPARAM wParam
2304, MPARAM lParam
2305)
cdf1e714 2306{
61243a51
DW
2307 //
2308 // Trace all ulMsgs - useful for the debugging
2309 //
cdf1e714
DW
2310#ifdef __WXDEBUG__
2311 wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"),
61243a51 2312 wxGetMessageName(ulMsg), wParam, lParam);
cdf1e714
DW
2313#endif // __WXDEBUG__
2314
19193a2c 2315 wxWindowOS2* pWnd = wxFindWinFromHandle((WXHWND)hWnd);
cdf1e714 2316
61243a51
DW
2317 //
2318 // When we get the first message for the HWND we just created, we associate
cdf1e714 2319 // it with wxWindow stored in wxWndHook
61243a51
DW
2320 //
2321 if (!pWnd && wxWndHook)
cdf1e714 2322 {
cdf1e714 2323 wxAssociateWinWithHandle(hWnd, wxWndHook);
61243a51 2324 pWnd = wxWndHook;
cdf1e714 2325 wxWndHook = NULL;
61243a51 2326 pWnd->SetHWND((WXHWND)hWnd);
cdf1e714
DW
2327 }
2328
5b3ed311 2329 MRESULT rc = (MRESULT)0;
e604d44b 2330
cdf1e714 2331
61243a51 2332 //
cdf1e714 2333 // Stop right here if we don't have a valid handle in our wxWindow object.
61243a51
DW
2334 //
2335 if (pWnd && !pWnd->GetHWND())
cdf1e714 2336 {
61243a51
DW
2337 pWnd->SetHWND((WXHWND) hWnd);
2338 rc = pWnd->OS2DefWindowProc(ulMsg, wParam, lParam );
2339 pWnd->SetHWND(0);
cdf1e714
DW
2340 }
2341 else
2342 {
61243a51
DW
2343 if (pWnd)
2344 rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam);
e604d44b 2345 else
61243a51 2346 rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
cdf1e714 2347 }
5b3ed311 2348
cdf1e714 2349 return rc;
61243a51 2350} // end of wxWndProc
cdf1e714 2351
61243a51
DW
2352//
2353// We will add (or delete) messages we need to handle at this default
2354// level as we go
2355//
0367c1c0 2356MRESULT wxWindowOS2::OS2WindowProc(
61243a51
DW
2357 WXUINT uMsg
2358, WXWPARAM wParam
2359, WXLPARAM lParam
2360)
cdf1e714 2361{
61243a51
DW
2362 //
2363 // Did we process the uMsg?
2364 //
2365 bool bProcessed = FALSE;
e604d44b 2366 MRESULT mResult;
cdf1e714 2367
61243a51
DW
2368 //
2369 // For most messages we should return 0 when we do process the message
2370 //
e604d44b 2371 mResult = (MRESULT)0;
61243a51
DW
2372
2373 switch (uMsg)
cdf1e714
DW
2374 {
2375 case WM_CREATE:
2376 {
61243a51
DW
2377 bool bMayCreate;
2378
2379 bProcessed = HandleCreate( (WXLPCREATESTRUCT)lParam
2380 ,&bMayCreate
2381 );
2382 if (bProcessed)
cdf1e714 2383 {
61243a51
DW
2384 //
2385 // Return 0 to bAllow window creation
2386 //
e604d44b 2387 mResult = (MRESULT)(bMayCreate ? 0 : -1);
cdf1e714
DW
2388 }
2389 }
2390 break;
2391
2392 case WM_DESTROY:
e604d44b
DW
2393 HandleDestroy();
2394 bProcessed = TRUE;
e604d44b 2395 break;
cdf1e714
DW
2396
2397 case WM_MOVE:
61243a51
DW
2398 bProcessed = HandleMove( LOWORD(lParam)
2399 ,HIWORD(lParam)
2400 );
cdf1e714
DW
2401 break;
2402
2403 case WM_SIZE:
61243a51
DW
2404 bProcessed = HandleSize( LOWORD(lParam)
2405 ,HIWORD(lParam)
2406 ,(WXUINT)wParam
2407 );
cdf1e714
DW
2408 break;
2409
2410 case WM_ACTIVATE:
2411 {
61243a51
DW
2412 WXWORD wState;
2413 WXHWND hWnd;
2414
2415 UnpackActivate( wParam
2416 ,lParam
2417 ,&wState
2418 ,&hWnd
2419 );
2420
2421 bProcessed = HandleActivate( wState
2422 ,(WXHWND)hWnd
2423 );
e604d44b 2424 bProcessed = FALSE;
cdf1e714
DW
2425 }
2426 break;
2427
2428 case WM_SETFOCUS:
61243a51
DW
2429 if (SHORT1FROMMP((MPARAM)lParam) == TRUE)
2430 bProcessed = HandleSetFocus((WXHWND)(HWND)wParam);
2431 else
2432 bProcessed = HandleKillFocus((WXHWND)(HWND)wParam);
cdf1e714
DW
2433 break;
2434
2435 case WM_PAINT:
61243a51 2436 bProcessed = HandlePaint();
cdf1e714
DW
2437 break;
2438
2439 case WM_CLOSE:
61243a51
DW
2440 //
2441 // Don't let the DefWindowProc() destroy our window - we'll do it
cdf1e714 2442 // ourselves in ~wxWindow
61243a51
DW
2443 //
2444 bProcessed = TRUE;
e604d44b 2445 mResult = (MRESULT)TRUE;
cdf1e714
DW
2446 break;
2447
61243a51
DW
2448 case WM_SHOW:
2449 bProcessed = HandleShow(wParam != 0, (int)lParam);
cdf1e714
DW
2450 break;
2451
61243a51
DW
2452 //
2453 // Under OS2 PM Joysticks are treated just like mouse events
2454 // The "Motion" events will be prevelent in joysticks
2455 //
cdf1e714 2456 case WM_MOUSEMOVE:
61243a51
DW
2457 case WM_BUTTON1DOWN:
2458 case WM_BUTTON1UP:
2459 case WM_BUTTON1DBLCLK:
2460 case WM_BUTTON1MOTIONEND:
2461 case WM_BUTTON1MOTIONSTART:
2462 case WM_BUTTON2DOWN:
2463 case WM_BUTTON2UP:
2464 case WM_BUTTON2DBLCLK:
2465 case WM_BUTTON2MOTIONEND:
2466 case WM_BUTTON2MOTIONSTART:
2467 case WM_BUTTON3DOWN:
2468 case WM_BUTTON3UP:
2469 case WM_BUTTON3DBLCLK:
2470 case WM_BUTTON3MOTIONEND:
2471 case WM_BUTTON3MOTIONSTART:
cdf1e714
DW
2472 {
2473 short x = LOWORD(lParam);
2474 short y = HIWORD(lParam);
2475
61243a51 2476 bProcessed = HandleMouseEvent(uMsg, x, y, (WXUINT)wParam);
cdf1e714
DW
2477 }
2478 break;
cdf1e714 2479 case WM_SYSCOMMAND:
61243a51 2480 bProcessed = HandleSysCommand(wParam, lParam);
cdf1e714
DW
2481 break;
2482
2483 case WM_COMMAND:
2484 {
2485 WORD id, cmd;
2486 WXHWND hwnd;
2487 UnpackCommand(wParam, lParam, &id, &hwnd, &cmd);
2488
61243a51 2489 bProcessed = HandleCommand(id, cmd, hwnd);
cdf1e714
DW
2490 }
2491 break;
2492
61243a51
DW
2493 //
2494 // For these messages we must return TRUE if process the message
2495 //
cdf1e714
DW
2496 case WM_DRAWITEM:
2497 case WM_MEASUREITEM:
2498 {
45bedfdd 2499 int nIdCtrl = (UINT)wParam;
45bedfdd 2500
61243a51 2501 if ( uMsg == WM_DRAWITEM )
cdf1e714 2502 {
45bedfdd 2503 bProcessed = OS2OnDrawItem(nIdCtrl,
cdf1e714
DW
2504 (WXDRAWITEMSTRUCT *)lParam);
2505 }
2506 else
2507 {
45bedfdd 2508 bProcessed = OS2OnMeasureItem(nIdCtrl,
cdf1e714
DW
2509 (WXMEASUREITEMSTRUCT *)lParam);
2510 }
2511
61243a51 2512 if ( bProcessed )
e604d44b 2513 mResult = (MRESULT)TRUE;
cdf1e714
DW
2514 }
2515 break;
2516
61243a51 2517 case WM_QUERYDLGCODE:
cdf1e714
DW
2518 if ( m_lDlgCode )
2519 {
e604d44b 2520 mResult = (MRESULT)m_lDlgCode;
61243a51 2521 bProcessed = TRUE;
cdf1e714 2522 }
61243a51 2523 //
cdf1e714 2524 //else: get the dlg code from the DefWindowProc()
61243a51 2525 //
cdf1e714
DW
2526 break;
2527
61243a51
DW
2528 //
2529 // In OS/2 PM all keyboard events are of the WM_CHAR type. Virtual key and key-up
2530 // and key-down events are obtained from the WM_CHAR params.
2531 //
2532 case WM_CHAR:
cdf1e714 2533 {
61243a51 2534 USHORT uKeyFlags = SHORT1FROMMP((MPARAM)wParam);
cdf1e714 2535
61243a51
DW
2536 if (uKeyFlags & KC_KEYUP)
2537 {
19193a2c 2538 //TODO: check if the cast to WXWORD isn't causing trouble
987da0d4 2539 bProcessed = HandleKeyUp((WXDWORD)wParam, lParam);
cdf1e714 2540 break;
61243a51
DW
2541 }
2542 else // keydown event
2543 {
2544 //
2545 // If this has been processed by an event handler,
2546 // return 0 now (we've handled it). DON't RETURN
2547 // we still need to process further
2548 //
987da0d4 2549 HandleKeyDown((WXDWORD)wParam, lParam);
61243a51 2550 if (uKeyFlags & KC_VIRTUALKEY)
cdf1e714 2551 {
61243a51
DW
2552 USHORT uVk = SHORT2FROMMP((MPARAM)lParam);
2553
2554 //
2555 // We consider these message "not interesting" to OnChar
2556 //
2557 if (uVk == VK_SHIFT || uVk == VK_CTRL )
2558 {
2559 bProcessed = TRUE;
2560 break;
2561 }
2562 switch(uVk)
2563 {
2564 //
2565 // Avoid duplicate messages to OnChar for these ASCII keys: they
2566 // will be translated by TranslateMessage() and received in WM_CHAR
2567 case VK_ESC:
2568 case VK_SPACE:
2569 case VK_ENTER:
2570 case VK_BACKSPACE:
2571 case VK_TAB:
2572 // But set processed to FALSE, not TRUE to still pass them to
2573 // the control's default window proc - otherwise built-in
2574 // keyboard handling won't work
2575 bProcessed = FALSE;
2576 break;
2577
2578 case VK_LEFT:
2579 case VK_RIGHT:
2580 case VK_DOWN:
2581 case VK_UP:
2582 default:
987da0d4 2583 bProcessed = HandleChar((WXDWORD)wParam, lParam);
61243a51
DW
2584 }
2585 break;
cdf1e714 2586 }
61243a51
DW
2587 else // WM_CHAR -- Always an ASCII character
2588 {
987da0d4 2589 bProcessed = HandleChar((WXDWORD)wParam, lParam, TRUE);
61243a51
DW
2590 break;
2591 }
2592 }
cdf1e714 2593 }
cdf1e714
DW
2594
2595 case WM_HSCROLL:
2596 case WM_VSCROLL:
2597 {
61243a51
DW
2598 WXWORD wCode;
2599 WXWORD wPos;
2600 WXHWND hWnd;
2601 UnpackScroll( wParam
2602 ,lParam
2603 ,&wCode
2604 ,&wPos
2605 ,&hWnd
2606 );
2607
2608 bProcessed = OS2OnScroll( uMsg == WM_HSCROLL ? wxHORIZONTAL
2609 : wxVERTICAL
2610 ,wCode
2611 ,wPos
2612 ,hWnd
2613 );
cdf1e714
DW
2614 }
2615 break;
2616
61243a51
DW
2617#if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
2618 case WM_CTLCOLORCHANGE:
cdf1e714 2619 {
e604d44b 2620 bProcessed = HandleCtlColor(&hBrush);
61243a51
DW
2621 }
2622 break;
2623#endif
8d854fa9
DW
2624 case WM_ERASEBACKGROUND:
2625 //
2626 // Returning TRUE to requestw PM to paint the window background
2627 // in SYSCLR_WINDOW. We don't really want that
2628 //
2629 bProcessed = HandleEraseBkgnd((WXHDC)(HPS)wParam);
2630 mResult = (MRESULT)(FALSE);
2631 break;
2632
cdf1e714
DW
2633 // the return value for this message is ignored
2634 case WM_SYSCOLORCHANGE:
61243a51 2635 bProcessed = HandleSysColorChange();
cdf1e714
DW
2636 break;
2637
61243a51
DW
2638 case WM_REALIZEPALETTE:
2639 bProcessed = HandlePaletteChanged();
cdf1e714
DW
2640 break;
2641
61243a51
DW
2642 // move all drag and drops to wxDrg
2643 case WM_ENDDRAG:
2644 bProcessed = HandleEndDrag(wParam);
cdf1e714
DW
2645 break;
2646
61243a51
DW
2647 case WM_INITDLG:
2648 bProcessed = HandleInitDialog((WXHWND)(HWND)wParam);
cdf1e714 2649
61243a51 2650 if ( bProcessed )
cdf1e714
DW
2651 {
2652 // we never set focus from here
e604d44b 2653 mResult = FALSE;
cdf1e714
DW
2654 }
2655 break;
2656
61243a51
DW
2657 // wxFrame specific message
2658 case WM_MINMAXFRAME:
f6bcfd97 2659 bProcessed = HandleGetMinMaxInfo((PSWP)wParam);
cdf1e714
DW
2660 break;
2661
61243a51
DW
2662 case WM_SYSVALUECHANGED:
2663 // TODO: do something
e604d44b 2664 mResult = (MRESULT)TRUE;
cdf1e714
DW
2665 break;
2666
61243a51
DW
2667 //
2668 // Comparable to WM_SETPOINTER for windows, only for just controls
2669 //
2670 case WM_CONTROLPOINTER:
2671 bProcessed = HandleSetCursor( SHORT1FROMMP(wParam) // Control ID
2672 ,(HWND)lParam // Cursor Handle
2673 );
2674 if (bProcessed )
cdf1e714 2675 {
61243a51
DW
2676 //
2677 // Returning TRUE stops the DefWindowProc() from further
cdf1e714
DW
2678 // processing this message - exactly what we need because we've
2679 // just set the cursor.
61243a51 2680 //
e604d44b 2681 mResult = (MRESULT)TRUE;
cdf1e714
DW
2682 }
2683 break;
2684 }
61243a51 2685 if (!bProcessed)
cdf1e714
DW
2686 {
2687#ifdef __WXDEBUG__
2688 wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."),
61243a51 2689 wxGetMessageName(uMsg));
cdf1e714 2690#endif // __WXDEBUG__
d08f23a7
DW
2691 if (IsKindOf(CLASSINFO(wxFrame)))
2692 mResult = ::WinDefWindowProc(m_hWnd, uMsg, wParam, lParam);
2693 else
2694 mResult = OS2DefWindowProc(uMsg, wParam, lParam);
cdf1e714 2695 }
e604d44b 2696 return mResult;
0367c1c0 2697} // end of wxWindowOS2::OS2WindowProc
cdf1e714 2698
61243a51 2699//
cdf1e714 2700// Dialog window proc
61243a51
DW
2701//
2702MRESULT wxDlgProc(
19193a2c 2703 HWND WXUNUSED(hWnd)
61243a51 2704, UINT uMsg
19193a2c
KB
2705, MPARAM WXUNUSED(wParam)
2706, MPARAM WXUNUSED(lParam))
cdf1e714 2707{
61243a51 2708 if (uMsg == WM_INITDLG)
cdf1e714 2709 {
61243a51
DW
2710 //
2711 // For this message, returning TRUE tells system to set focus to the
cdf1e714 2712 // first control in the dialog box
61243a51
DW
2713 //
2714 return (MRESULT)TRUE;
cdf1e714
DW
2715 }
2716 else
2717 {
61243a51
DW
2718 //
2719 // For all the other ones, FALSE means that we didn't process the
cdf1e714 2720 // message
61243a51
DW
2721 //
2722 return (MRESULT)0;
cdf1e714 2723 }
61243a51 2724} // end of wxDlgProc
cdf1e714 2725
61243a51
DW
2726wxWindow* wxFindWinFromHandle(
2727 WXHWND hWnd
2728)
cdf1e714 2729{
61243a51
DW
2730 wxNode* pNode = wxWinHandleList->Find((long)hWnd);
2731
2732 if (!pNode)
cdf1e714 2733 return NULL;
61243a51
DW
2734 return (wxWindow *)pNode->Data();
2735} // end of wxFindWinFromHandle
cdf1e714 2736
61243a51
DW
2737void wxAssociateWinWithHandle(
2738 HWND hWnd
19193a2c 2739, wxWindowOS2* pWin
61243a51 2740)
cdf1e714 2741{
61243a51
DW
2742 //
2743 // Adding NULL hWnd is (first) surely a result of an error and
cdf1e714 2744 // (secondly) breaks menu command processing
61243a51 2745 //
cdf1e714
DW
2746 wxCHECK_RET( hWnd != (HWND)NULL,
2747 wxT("attempt to add a NULL hWnd to window list ignored") );
2748
2749
61243a51
DW
2750 wxWindow* pOldWin = wxFindWinFromHandle((WXHWND) hWnd);
2751
2752 if (pOldWin && (pOldWin != pWin))
cdf1e714 2753 {
61243a51
DW
2754 wxString str(pWin->GetClassInfo()->GetClassName());
2755 wxLogError( "Bug! Found existing HWND %X for new window of class %s"
2756 ,(int)hWnd
2757 ,(const char*)str
2758 );
cdf1e714 2759 }
61243a51 2760 else if (!pOldWin)
cdf1e714 2761 {
61243a51
DW
2762 wxWinHandleList->Append( (long)hWnd
2763 ,pWin
2764 );
cdf1e714 2765 }
61243a51 2766} // end of wxAssociateWinWithHandle
cdf1e714 2767
61243a51 2768void wxRemoveHandleAssociation(
19193a2c 2769 wxWindowOS2* pWin
61243a51 2770)
cdf1e714 2771{
61243a51
DW
2772 wxWinHandleList->DeleteObject(pWin);
2773} // end of wxRemoveHandleAssociation
cdf1e714 2774
61243a51 2775//
cdf1e714
DW
2776// Default destroyer - override if you destroy it in some other way
2777// (e.g. with MDI child windows)
61243a51 2778//
0367c1c0 2779void wxWindowOS2::OS2DestroyWindow()
cdf1e714
DW
2780{
2781}
2782
0367c1c0 2783void wxWindowOS2::OS2DetachWindowMenu()
cdf1e714 2784{
19193a2c 2785#ifndef __WXUNIVERSAL__
61243a51 2786 if (m_hMenu)
cdf1e714 2787 {
61243a51 2788 HMENU hMenu = (HMENU)m_hMenu;
cdf1e714 2789
61243a51
DW
2790 int nN = (int)::WinSendMsg(hMenu, MM_QUERYITEMCOUNT, 0, 0);
2791 int i;
2792
2793 for (i = 0; i < nN; i++)
cdf1e714 2794 {
61243a51
DW
2795 wxChar zBuf[100];
2796 int nChars = (int)::WinSendMsg( hMenu
2797 ,MM_QUERYITEMTEXT
2798 ,MPFROM2SHORT(i, nN)
2799 ,zBuf
2800 );
2801 if (!nChars)
cdf1e714
DW
2802 {
2803 wxLogLastError(wxT("GetMenuString"));
cdf1e714
DW
2804 continue;
2805 }
2806
61243a51 2807 if (wxStrcmp(zBuf, wxT("&Window")) == 0)
cdf1e714 2808 {
61243a51 2809 ::WinSendMsg(hMenu, MM_DELETEITEM, MPFROM2SHORT(i, TRUE), 0);
cdf1e714
DW
2810 break;
2811 }
2812 }
2813 }
19193a2c 2814#endif // __WXUNIVERSAL__
0367c1c0 2815} // end of wxWindowOS2::OS2DetachWindowMenu
cdf1e714 2816
0367c1c0 2817bool wxWindowOS2::OS2Create(
f23208ca
DW
2818 WXHWND hParent
2819, PSZ zClass
61243a51 2820, const wxChar* zTitle
61243a51 2821, WXDWORD dwStyle
f23208ca
DW
2822, long lX
2823, long lY
2824, long lWidth
2825, long lHeight
2826, WXHWND hOwner
19193a2c 2827, WXHWND WXUNUSED(hZOrder)
f23208ca
DW
2828, unsigned long ulId
2829, void* pCtlData
2830, void* pPresParams
008089f6 2831, WXDWORD dwExStyle
61243a51
DW
2832)
2833{
914589c2
DW
2834 ERRORID vError;
2835 wxString sError;
5b3ed311 2836 long lX1 = 0L;
f23208ca 2837 long lY1 = 0L;
5b3ed311
DW
2838 long lWidth1 = 20L;
2839 long lHeight1 = 20L;
f23208ca 2840 int nControlId = 0;
51c1d535
DW
2841 int nNeedsubclass = 0;
2842 PCSZ pszClass = zClass;
cdf1e714 2843
61243a51 2844 //
cdf1e714
DW
2845 // Find parent's size, if it exists, to set up a possible default
2846 // panel size the size of the parent window
61243a51 2847 //
cb71578c
DW
2848 lX1 = lX;
2849 lY1 = lY;
f23208ca
DW
2850 if (lWidth > -1L)
2851 lWidth1 = lWidth;
2852 if (lHeight > -1L)
2853 lHeight1 = lHeight;
cdf1e714
DW
2854
2855 wxWndHook = this;
2856
f23208ca
DW
2857 //
2858 // check to see if the new window is a standard control
2859 //
2860 if ((ULONG)zClass == (ULONG)WC_BUTTON ||
2861 (ULONG)zClass == (ULONG)WC_COMBOBOX ||
2862 (ULONG)zClass == (ULONG)WC_CONTAINER ||
2863 (ULONG)zClass == (ULONG)WC_ENTRYFIELD ||
40bd6154 2864 (ULONG)zClass == (ULONG)WC_FRAME ||
f23208ca
DW
2865 (ULONG)zClass == (ULONG)WC_LISTBOX ||
2866 (ULONG)zClass == (ULONG)WC_MENU ||
2867 (ULONG)zClass == (ULONG)WC_NOTEBOOK ||
2868 (ULONG)zClass == (ULONG)WC_SCROLLBAR ||
2869 (ULONG)zClass == (ULONG)WC_SPINBUTTON ||
2870 (ULONG)zClass == (ULONG)WC_STATIC ||
2871 (ULONG)zClass == (ULONG)WC_TITLEBAR ||
2872 (ULONG)zClass == (ULONG)WC_VALUESET
2873 )
cdf1e714 2874 {
f23208ca 2875 nControlId = ulId;
cdf1e714 2876 }
51c1d535
DW
2877 else
2878 {
2879 // no standard controls
2880 if(wxString (wxT("wxFrameClass")) == wxString(zClass) )
2881 {
2882 pszClass = WC_FRAME;
2883 nNeedsubclass = 1;
2884 }
2885 else
2886 {
2887 nControlId = ulId;
2888 if(nControlId < 0)
2889 nControlId = FID_CLIENT;
2890 }
2891 }
cdf1e714 2892
19193a2c
KB
2893 HWND parent;
2894 if ( GetWindowStyleFlag() & wxPOPUP_WINDOW )
2895 {
2896 // popup windows should have desktop as parent because they shouldn't
2897 // be limited to the parents client area as child windows usually are
2898 parent = HWND_DESKTOP;
2899 }
2900 else if ( hParent )
2901 {
2902 parent = hParent;
2903 }
2904 else
2905 {
2906 // top level window
2907 parent = NULL;
2908 }
2909
f23208ca
DW
2910 //
2911 // We will either have a registered class via string name or a standard PM Class via a long
2912 //
19193a2c
KB
2913 m_hWnd = (WXHWND)::WinCreateWindow(parent, zClass,
2914 (PSZ)zTitle ? zTitle : wxT(""),
2915 dwStyle, lX1, lY1, lWidth, lHeight,
2916 hOwner, HWND_TOP, (ULONG)nControlId,
2917 pCtlData, pPresParams);
2918
f23208ca
DW
2919 if (!m_hWnd)
2920 {
2921 vError = ::WinGetLastError(vHabmain);
2922 sError = wxPMErrorToStr(vError);
2923 wxLogError("Can't create window of class %s!. Error: %s\n", zClass, sError);
2924 return FALSE;
cdf1e714 2925 }
008089f6 2926 m_dwExStyle = dwExStyle;
f6bcfd97 2927 ::WinSetWindowULong(m_hWnd, QWL_USER, (ULONG) this);
cdf1e714 2928 wxWndHook = NULL;
61243a51 2929
cdf1e714 2930#ifdef __WXDEBUG__
61243a51
DW
2931 wxNode* pNode = wxWinHandleList->Member(this);
2932
2933 if (pNode)
cdf1e714 2934 {
61243a51
DW
2935 HWND hWnd = (HWND)pNode->GetKeyInteger();
2936
2937 if (hWnd != (HWND)m_hWnd)
2938
cdf1e714
DW
2939 {
2940 wxLogError("A second HWND association is being added for the same window!");
2941 }
2942 }
2943#endif
61243a51
DW
2944 wxAssociateWinWithHandle((HWND)m_hWnd
2945 ,this
2946 );
cd212ee4 2947 //
e604d44b
DW
2948 // Now need to subclass window.
2949 //
51c1d535
DW
2950 if(!nNeedsubclass)
2951 {
2952 wxAssociateWinWithHandle((HWND)m_hWnd,this);
2953 }
2954 else
2955 {
2956 SubclassWin(GetHWND());
2957 }
cdf1e714 2958 return TRUE;
0367c1c0 2959} // end of wxWindowOS2::OS2Create
cdf1e714
DW
2960
2961// ===========================================================================
2962// OS2 PM message handlers
2963// ===========================================================================
2964
2965// ---------------------------------------------------------------------------
61243a51 2966// window creation/destruction
cdf1e714
DW
2967// ---------------------------------------------------------------------------
2968
0367c1c0 2969bool wxWindowOS2::HandleCreate(
19193a2c 2970 WXLPCREATESTRUCT WXUNUSED(vCs)
61243a51
DW
2971, bool* pbMayCreate
2972)
cdf1e714 2973{
19193a2c 2974 wxWindowCreateEvent vEvent((wxWindow*)this);
cdf1e714 2975
61243a51
DW
2976 (void)GetEventHandler()->ProcessEvent(vEvent);
2977 *pbMayCreate = TRUE;
cdf1e714 2978 return TRUE;
0367c1c0 2979} // end of wxWindowOS2::HandleCreate
cdf1e714 2980
0367c1c0 2981bool wxWindowOS2::HandleDestroy()
cdf1e714 2982{
19193a2c 2983 wxWindowDestroyEvent vEvent((wxWindow*)this);
cdf1e714 2984
61243a51
DW
2985 (void)GetEventHandler()->ProcessEvent(vEvent);
2986
2987 //
2988 // Delete our drop target if we've got one
2989 //
cdf1e714 2990#if wxUSE_DRAG_AND_DROP
61243a51 2991 if (m_dropTarget != NULL)
cdf1e714 2992 {
61243a51 2993 m_dropTarget->Revoke(m_hWnd);
cdf1e714
DW
2994 delete m_dropTarget;
2995 m_dropTarget = NULL;
2996 }
2997#endif // wxUSE_DRAG_AND_DROP
2998
61243a51 2999 //
cdf1e714 3000 // WM_DESTROY handled
61243a51 3001 //
cdf1e714 3002 return TRUE;
0367c1c0 3003} // end of wxWindowOS2::HandleDestroy
cdf1e714
DW
3004
3005// ---------------------------------------------------------------------------
3006// activation/focus
3007// ---------------------------------------------------------------------------
0367c1c0 3008void wxWindowOS2::OnSetFocus(
61243a51
DW
3009 wxFocusEvent& rEvent
3010)
cdf1e714 3011{
61243a51 3012 rEvent.Skip();
0367c1c0 3013} // end of wxWindowOS2::OnSetFocus
61243a51 3014
0367c1c0 3015bool wxWindowOS2::HandleActivate(
61243a51
DW
3016 int nState
3017, WXHWND WXUNUSED(hActivate)
3018)
3019{
3020 wxActivateEvent vEvent( wxEVT_ACTIVATE
3021 ,(bool)nState
3022 ,m_windowId
3023 );
3024 vEvent.SetEventObject(this);
3025 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3026} // end of wxWindowOS2::HandleActivate
61243a51 3027
0367c1c0 3028bool wxWindowOS2::HandleSetFocus(
61243a51
DW
3029 WXHWND WXUNUSED(hWnd)
3030)
cdf1e714
DW
3031{
3032#if wxUSE_CARET
61243a51 3033 //
cdf1e714 3034 // Deal with caret
61243a51
DW
3035 //
3036 if (m_caret)
cdf1e714
DW
3037 {
3038 m_caret->OnSetFocus();
3039 }
3040#endif // wxUSE_CARET
3041
1bcfc0e1
DW
3042#if wxUSE_TEXTCTRL
3043 // If it's a wxTextCtrl don't send the event as it will be done
3044 // after the control gets to process it from EN_FOCUS handler
3045 if ( wxDynamicCastThis(wxTextCtrl) )
cdf1e714 3046 {
1bcfc0e1 3047 return FALSE;
cdf1e714 3048 }
1bcfc0e1 3049#endif // wxUSE_TEXTCTRL
cdf1e714 3050
61243a51 3051 wxFocusEvent vEvent(wxEVT_SET_FOCUS, m_windowId);
cdf1e714 3052
61243a51
DW
3053 vEvent.SetEventObject(this);
3054 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3055} // end of wxWindowOS2::HandleSetFocus
cdf1e714 3056
0367c1c0 3057bool wxWindowOS2::HandleKillFocus(
61243a51
DW
3058 WXHWND WXUNUSED(hWnd)
3059)
cdf1e714
DW
3060{
3061#if wxUSE_CARET
61243a51 3062 //
cdf1e714 3063 // Deal with caret
61243a51
DW
3064 //
3065 if (m_caret)
cdf1e714
DW
3066 {
3067 m_caret->OnKillFocus();
3068 }
3069#endif // wxUSE_CARET
3070
61243a51
DW
3071 wxFocusEvent vEvent( wxEVT_KILL_FOCUS
3072 ,m_windowId
3073 );
cdf1e714 3074
61243a51
DW
3075 vEvent.SetEventObject(this);
3076 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3077} // end of wxWindowOS2::HandleKillFocus
cdf1e714
DW
3078
3079// ---------------------------------------------------------------------------
3080// miscellaneous
3081// ---------------------------------------------------------------------------
3082
0367c1c0 3083bool wxWindowOS2::HandleShow(
61243a51 3084 bool bShow
19193a2c 3085, int WXUNUSED(nStatus)
61243a51 3086)
cdf1e714 3087{
19193a2c 3088 wxShowEvent vEvent(GetId(), bShow);
cdf1e714 3089
61243a51
DW
3090 vEvent.m_eventObject = this;
3091 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3092} // end of wxWindowOS2::HandleShow
cdf1e714 3093
0367c1c0 3094bool wxWindowOS2::HandleInitDialog(
61243a51
DW
3095 WXHWND WXUNUSED(hWndFocus)
3096)
cdf1e714 3097{
61243a51 3098 wxInitDialogEvent vEvent(GetId());
cdf1e714 3099
61243a51
DW
3100 vEvent.m_eventObject = this;
3101 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3102} // end of wxWindowOS2::HandleInitDialog
cdf1e714 3103
19193a2c 3104bool wxWindowOS2::HandleEndDrag(WXWPARAM WXUNUSED(wParam))
cdf1e714 3105{
61243a51 3106 // TODO: We'll handle drag and drop later
cdf1e714
DW
3107 return FALSE;
3108}
3109
0367c1c0 3110bool wxWindowOS2::HandleSetCursor(
19193a2c 3111 USHORT WXUNUSED(vId)
61243a51
DW
3112, WXHWND hPointer
3113)
cdf1e714 3114{
61243a51
DW
3115 //
3116 // Under OS/2 PM this allows the pointer to be changed
3117 // as it passes over a control
3118 //
3119 ::WinSetPointer(HWND_DESKTOP, (HPOINTER)hPointer);
3120 return TRUE;
0367c1c0 3121} // end of wxWindowOS2::HandleSetCursor
cdf1e714
DW
3122
3123// ---------------------------------------------------------------------------
3124// owner drawn stuff
3125// ---------------------------------------------------------------------------
0367c1c0 3126bool wxWindowOS2::OS2OnDrawItem(
61243a51
DW
3127 int vId
3128, WXDRAWITEMSTRUCT* pItemStruct
3129)
cdf1e714 3130{
19193a2c 3131#if wxUSE_OWNER_DRAWN
402e2f7c 3132 wxDC vDc;
61243a51 3133
19193a2c 3134#if wxUSE_MENUS_NATIVE
61243a51 3135 //
402e2f7c 3136 // Is it a menu item?
61243a51 3137 //
402e2f7c
DW
3138 if (vId == 0)
3139 {
5afb9458
DW
3140 ERRORID vError;
3141 wxString sError;
402e2f7c 3142 POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
23122f8c
DW
3143 wxFrame* pFrame = (wxFrame*)this;
3144 wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
402e2f7c 3145 HDC hDC = ::GpiQueryDevice(pMeasureStruct->hps);
23122f8c
DW
3146 wxRect vRect( pMeasureStruct->rclItem.xLeft
3147 ,pMeasureStruct->rclItem.yBottom
3148 ,pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft
3149 ,pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom
3150 );
402e2f7c
DW
3151 vDc.SetHDC( hDC
3152 ,FALSE
3153 );
3154 vDc.SetHPS(pMeasureStruct->hps);
5afb9458
DW
3155 //
3156 // Load the wxWindows Pallete and set to RGB mode
3157 //
3158 if (!::GpiCreateLogColorTable( pMeasureStruct->hps
3159 ,0L
3160 ,LCOLF_CONSECRGB
3161 ,0L
3162 ,(LONG)wxTheColourDatabase->m_nSize
3163 ,(PLONG)wxTheColourDatabase->m_palTable
3164 ))
3165 {
3166 vError = ::WinGetLastError(vHabmain);
3167 sError = wxPMErrorToStr(vError);
3168 wxLogError("Unable to set current color table. Error: %s\n", sError);
3169 }
3170 //
3171 // Set the color table to RGB mode
3172 //
3173 if (!::GpiCreateLogColorTable( pMeasureStruct->hps
3174 ,0L
3175 ,LCOLF_RGB
3176 ,0L
3177 ,0L
3178 ,NULL
3179 ))
3180 {
3181 vError = ::WinGetLastError(vHabmain);
3182 sError = wxPMErrorToStr(vError);
3183 wxLogError("Unable to set current color table. Error: %s\n", sError);
3184 }
cdf1e714 3185
23122f8c
DW
3186 wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
3187
3188
3189 int eAction = 0;
3190 int eStatus = 0;
cdf1e714 3191
402e2f7c 3192 if (pMeasureStruct->fsAttribute == pMeasureStruct->fsAttributeOld)
23122f8c
DW
3193 {
3194 //
3195 // Entire Item needs to be redrawn (either it has reappeared from
3196 // behind another window or is being displayed for the first time
3197 //
402e2f7c 3198 eAction = wxOwnerDrawn::wxODDrawAll;
23122f8c
DW
3199
3200 if (pMeasureStruct->fsAttribute & MIA_HILITED)
3201 {
3202 //
3203 // If it is currently selected we let the system handle it
3204 //
3205 eStatus |= wxOwnerDrawn::wxODSelected;
3206 }
3207 if (pMeasureStruct->fsAttribute & MIA_CHECKED)
3208 {
3209 //
3210 // If it is currently checked we draw our own
3211 //
3212 eStatus |= wxOwnerDrawn::wxODChecked;
3213 pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_CHECKED;
3214 }
3215 if (pMeasureStruct->fsAttribute & MIA_DISABLED)
3216 {
3217 //
3218 // If it is currently disabled we let the system handle it
3219 //
3220 eStatus |= wxOwnerDrawn::wxODDisabled;
3221 }
3222 //
3223 // Don't really care about framed (indicationg focus) or NoDismiss
3224 //
3225 }
402e2f7c 3226 else
23122f8c 3227 {
5afb9458
DW
3228 if (pMeasureStruct->fsAttribute & MIA_HILITED)
3229 {
3230 eAction = wxOwnerDrawn::wxODDrawAll;
3231 eStatus |= wxOwnerDrawn::wxODSelected;
3232 //
3233 // Keep the system from trying to highlight with its bogus colors
3234 //
3235 pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_HILITED;
3236 }
3237 else if (!(pMeasureStruct->fsAttribute & MIA_HILITED))
3238 {
3239 eAction = wxOwnerDrawn::wxODDrawAll;
3240 eStatus = 0;
3241 //
3242 // Keep the system from trying to highlight with its bogus colors
3243 //
3244 pMeasureStruct->fsAttribute = pMeasureStruct->fsAttributeOld &= ~MIA_HILITED;
3245 }
3246 else
3247 {
3248 //
3249 // For now we don't care about anything else
3250 // just ignore the entire message!
3251 //
3252 return TRUE;
3253 }
23122f8c
DW
3254 }
3255 //
3256 // Now redraw the item
3257 //
45bedfdd
DW
3258 return(pMenuItem->OnDrawItem( vDc
3259 ,vRect
23122f8c
DW
3260 ,(wxOwnerDrawn::wxODAction)eAction
3261 ,(wxOwnerDrawn::wxODStatus)eStatus
45bedfdd 3262 ));
402e2f7c
DW
3263 //
3264 // leave the fsAttribute and fsOldAttribute unchanged. If different,
3265 // the system will do the highlight or fraeming or disabling for us,
3266 // otherwise, we'd have to do it ourselves.
61243a51 3267 //
cdf1e714 3268 }
19193a2c 3269#endif // wxUSE_MENUS_NATIVE
cdf1e714 3270
402e2f7c
DW
3271 wxWindow* pItem = FindItem(vId);
3272
3273 if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
3274 {
3275 return ((wxControl *)pItem)->OS2OnDraw(pItemStruct);
3276 }
19193a2c
KB
3277#else
3278 vId = vId;
3279 pItemStruct = pItemStruct;
61243a51 3280#endif
402e2f7c 3281 return FALSE;
0367c1c0 3282} // end of wxWindowOS2::OS2OnDrawItem
cdf1e714 3283
0367c1c0 3284bool wxWindowOS2::OS2OnMeasureItem(
402e2f7c
DW
3285 int lId
3286, WXMEASUREITEMSTRUCT* pItemStruct
3287)
0e320a79 3288{
19193a2c 3289#if wxUSE_OWNER_DRAWN
402e2f7c
DW
3290 //
3291 // Is it a menu item?
3292 //
45bedfdd 3293 if (lId == 65536) // I really don't like this...has to be a better indicator
cdf1e714 3294 {
4049cc1c 3295 if (IsKindOf(CLASSINFO(wxFrame))) // we'll assume if Frame then a menu
45bedfdd 3296 {
4049cc1c
DW
3297 size_t nWidth;
3298 size_t nHeight;
3299 POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
45bedfdd
DW
3300 wxFrame* pFrame = (wxFrame*)this;
3301 wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
cdf1e714 3302
45bedfdd 3303 wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
4049cc1c
DW
3304 nWidth = 0L;
3305 nHeight = 0L;
3306 if (pMenuItem->OnMeasureItem( &nWidth
3307 ,&nHeight
3308 ))
3309 {
3310 pMeasureStruct->rclItem.xRight = nWidth;
3311 pMeasureStruct->rclItem.xLeft = 0L;
3312 pMeasureStruct->rclItem.yTop = nHeight;
3313 pMeasureStruct->rclItem.yBottom = 0L;
3314 return TRUE;
3315 }
3316 return FALSE;
45bedfdd 3317 }
cdf1e714 3318 }
f15b4952 3319 wxWindow* pItem = FindItem(lId);
cdf1e714 3320
402e2f7c 3321 if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
cdf1e714 3322 {
402e2f7c 3323 return ((wxControl *)pItem)->OS2OnMeasure(pItemStruct);
cdf1e714 3324 }
19193a2c
KB
3325#else
3326 lId = lId;
3327 pItemStruct = pItemStruct;
3328#endif // wxUSE_OWNER_DRAWN
cdf1e714 3329 return FALSE;
0e320a79
DW
3330}
3331
cdf1e714
DW
3332// ---------------------------------------------------------------------------
3333// colours and palettes
3334// ---------------------------------------------------------------------------
849949b1 3335
0367c1c0 3336bool wxWindowOS2::HandleSysColorChange()
0e320a79 3337{
61243a51 3338 wxSysColourChangedEvent vEvent;
cdf1e714 3339
61243a51
DW
3340 vEvent.SetEventObject(this);
3341 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3342} // end of wxWindowOS2::HandleSysColorChange
0e320a79 3343
0367c1c0 3344bool wxWindowOS2::HandleCtlColor(
19193a2c 3345 WXHBRUSH* WXUNUSED(phBrush)
61243a51 3346)
0e320a79 3347{
61243a51
DW
3348 //
3349 // Not much provided with message. So not sure I can do anything with it
3350 //
3351 return TRUE;
0367c1c0 3352} // end of wxWindowOS2::HandleCtlColor
cdf1e714 3353
0e320a79 3354
cdf1e714 3355// Define for each class of dialog and control
19193a2c
KB
3356WXHBRUSH wxWindowOS2::OnCtlColor(WXHDC WXUNUSED(hDC),
3357 WXHWND WXUNUSED(hWnd),
3358 WXUINT WXUNUSED(nCtlColor),
3359 WXUINT WXUNUSED(message),
3360 WXWPARAM WXUNUSED(wParam),
3361 WXLPARAM WXUNUSED(lParam))
0e320a79 3362{
cdf1e714 3363 return (WXHBRUSH)0;
0e320a79
DW
3364}
3365
0367c1c0 3366bool wxWindowOS2::HandlePaletteChanged()
0e320a79 3367{
61243a51
DW
3368 // need to set this to something first
3369 WXHWND hWndPalChange = NULLHANDLE;
cdf1e714 3370
61243a51
DW
3371 wxPaletteChangedEvent vEvent(GetId());
3372
3373 vEvent.SetEventObject(this);
3374 vEvent.SetChangedWindow(wxFindWinFromHandle(hWndPalChange));
0e320a79 3375
61243a51 3376 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3377} // end of wxWindowOS2::HandlePaletteChanged
61243a51 3378
61243a51 3379//
cdf1e714 3380// Responds to colour changes: passes event on to children.
61243a51 3381//
0367c1c0 3382void wxWindowOS2::OnSysColourChanged(
61243a51
DW
3383 wxSysColourChangedEvent& rEvent
3384)
0e320a79 3385{
61243a51
DW
3386 wxNode* pNode = GetChildren().First();
3387
3388 while (pNode)
cdf1e714 3389 {
61243a51 3390 //
cdf1e714 3391 // Only propagate to non-top-level windows
61243a51
DW
3392 //
3393 wxWindow* pWin = (wxWindow *)pNode->Data();
3394
3395 if (pWin->GetParent())
cdf1e714 3396 {
61243a51 3397 wxSysColourChangedEvent vEvent;
cdf1e714 3398
61243a51
DW
3399 rEvent.m_eventObject = pWin;
3400 pWin->GetEventHandler()->ProcessEvent(vEvent);
3401 }
3402 pNode = pNode->Next();
cdf1e714 3403 }
0367c1c0 3404} // end of wxWindowOS2::OnSysColourChanged
0e320a79 3405
cdf1e714
DW
3406// ---------------------------------------------------------------------------
3407// painting
3408// ---------------------------------------------------------------------------
3409
0367c1c0 3410bool wxWindowOS2::HandlePaint()
0e320a79 3411{
19193a2c
KB
3412 HRGN hRgn;
3413 wxPaintEvent vEvent(m_windowId);
40bd6154
DW
3414 HPS hPS;
3415 RECTL vRect;
19193a2c
KB
3416 bool bProcessed;
3417
3418 // Create empty region
3419 // TODO: get HPS somewhere else if possible
3420 hPS = ::WinGetPS(GetHwnd());
3421 hRgn = ::GpiCreateRegion(hPS, 0, NULL);
61243a51 3422
19193a2c 3423 if (::WinQueryUpdateRegion(GetHwnd(), hRgn) == RGN_ERROR)
61243a51
DW
3424 {
3425 wxLogLastError("CreateRectRgn");
3426 return FALSE;
3427 }
7e99520b 3428
19193a2c
KB
3429 m_updateRegion = wxRegion(hRgn, hPS);
3430
61243a51 3431 vEvent.SetEventObject(this);
19193a2c
KB
3432 bProcessed = GetEventHandler()->ProcessEvent(vEvent);
3433
19193a2c 3434 return GetEventHandler()->ProcessEvent(vEvent); //bProcessed;
0367c1c0 3435} // end of wxWindowOS2::HandlePaint
0e320a79 3436
0367c1c0 3437bool wxWindowOS2::HandleEraseBkgnd(
8d854fa9
DW
3438 WXHDC hDC
3439)
0e320a79 3440{
8d854fa9 3441 SWP vSwp;
19193a2c 3442 bool rc;
8d854fa9
DW
3443
3444 ::WinQueryWindowPos(GetHwnd(), &vSwp);
3445 if (vSwp.fl & SWP_MINIMIZE)
61243a51 3446 return TRUE;
cdf1e714 3447
8d854fa9
DW
3448 wxDC vDC;
3449
3450 vDC.m_hPS = (HPS)hDC; // this is really a PS
19193a2c 3451 vDC.SetWindow((wxWindow*)this);
8d854fa9 3452 vDC.BeginDrawing();
cdf1e714 3453
8d854fa9
DW
3454 wxEraseEvent vEvent(m_windowId, &vDC);
3455
3456 vEvent.SetEventObject(this);
cdf1e714 3457
19193a2c 3458 rc = GetEventHandler()->ProcessEvent(vEvent);
cdf1e714 3459
8d854fa9
DW
3460 vDC.EndDrawing();
3461 vDC.m_hPS = NULLHANDLE;
61243a51 3462 return TRUE;
0367c1c0 3463} // end of wxWindowOS2::HandleEraseBkgnd
cdf1e714 3464
0367c1c0 3465void wxWindowOS2::OnEraseBackground(
61243a51
DW
3466 wxEraseEvent& rEvent
3467)
0e320a79 3468{
8d854fa9
DW
3469 RECTL vRect;
3470 HPS hPS = rEvent.m_dc->m_hPS;
19193a2c
KB
3471 APIRET rc;
3472 LONG lColor = m_backgroundColour.GetPixel();
8d854fa9 3473
19193a2c
KB
3474 rc = ::WinQueryWindowRect(GetHwnd(), &vRect);
3475 rc = ::WinFillRect(hPS, &vRect, lColor);
0367c1c0 3476} // end of wxWindowOS2::OnEraseBackground
0e320a79 3477
cdf1e714
DW
3478// ---------------------------------------------------------------------------
3479// moving and resizing
3480// ---------------------------------------------------------------------------
0e320a79 3481
0367c1c0 3482bool wxWindowOS2::HandleMinimize()
0e320a79 3483{
61243a51 3484 wxIconizeEvent vEvent(m_windowId);
cdf1e714 3485
61243a51
DW
3486 vEvent.SetEventObject(this);
3487 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3488} // end of wxWindowOS2::HandleMinimize
0e320a79 3489
0367c1c0 3490bool wxWindowOS2::HandleMaximize()
0e320a79 3491{
61243a51 3492 wxMaximizeEvent vEvent(m_windowId);
cdf1e714 3493
61243a51
DW
3494 vEvent.SetEventObject(this);
3495 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3496} // end of wxWindowOS2::HandleMaximize
0e320a79 3497
0367c1c0 3498bool wxWindowOS2::HandleMove(
61243a51
DW
3499 int nX
3500, int nY
3501)
0e320a79 3502{
19193a2c 3503 wxMoveEvent vEvent(wxPoint(nX, nY), m_windowId);
cdf1e714 3504
61243a51
DW
3505 vEvent.SetEventObject(this);
3506 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3507} // end of wxWindowOS2::HandleMove
0e320a79 3508
0367c1c0 3509bool wxWindowOS2::HandleSize(
61243a51
DW
3510 int nWidth
3511, int nHeight
3512, WXUINT WXUNUSED(nFlag)
3513)
0e320a79 3514{
19193a2c 3515 wxSizeEvent vEvent(wxSize(nWidth, nHeight), m_windowId);
cdf1e714 3516
61243a51
DW
3517 vEvent.SetEventObject(this);
3518 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3519} // end of wxWindowOS2::HandleSize
0e320a79 3520
0367c1c0 3521bool wxWindowOS2::HandleGetMinMaxInfo(
61243a51
DW
3522 PSWP pSwp
3523)
0e320a79 3524{
61243a51
DW
3525 bool bRc = FALSE;
3526 POINTL vPoint;
cdf1e714 3527
61243a51 3528 switch(pSwp->fl)
cdf1e714 3529 {
61243a51
DW
3530 case SWP_MAXIMIZE:
3531 ::WinGetMaxPosition(GetHwnd(), pSwp);
3532 m_maxWidth = pSwp->cx;
3533 m_maxHeight = pSwp->cy;
3534 break;
cdf1e714 3535
61243a51
DW
3536 case SWP_MINIMIZE:
3537 ::WinGetMinPosition(GetHwnd(), pSwp, &vPoint);
3538 m_minWidth = pSwp->cx;
3539 m_minHeight = pSwp->cy;
3540 break;
cdf1e714 3541
61243a51
DW
3542 default:
3543 return FALSE;
cdf1e714 3544 }
61243a51 3545 return TRUE;
0367c1c0 3546} // end of wxWindowOS2::HandleGetMinMaxInfo
0e320a79 3547
cdf1e714
DW
3548// ---------------------------------------------------------------------------
3549// command messages
3550// ---------------------------------------------------------------------------
0367c1c0 3551bool wxWindowOS2::HandleCommand(
61243a51
DW
3552 WXWORD wId
3553, WXWORD wCmd
3554, WXHWND hControl
3555)
0e320a79 3556{
19193a2c 3557#if wxUSE_MENUS_NATIVE
61243a51 3558 if (wxCurrentPopupMenu)
0e320a79 3559 {
61243a51 3560 wxMenu* pPopupMenu = wxCurrentPopupMenu;
0e320a79 3561
61243a51
DW
3562 wxCurrentPopupMenu = NULL;
3563 return pPopupMenu->OS2Command(wCmd, wId);
cdf1e714 3564 }
19193a2c 3565#endif // wxUSE_MENUS_NATIVE
0e320a79 3566
61243a51
DW
3567 wxWindow* pWin = FindItem(wId);
3568
3569 if (!pWin)
cdf1e714 3570 {
61243a51 3571 pWin = wxFindWinFromHandle(hControl);
0e320a79 3572 }
cdf1e714 3573
61243a51 3574 if (pWin)
19193a2c
KB
3575 return pWin->OS2Command(wCmd, wId);
3576
cdf1e714 3577 return FALSE;
0367c1c0 3578} // end of wxWindowOS2::HandleCommand
de44a9f0 3579
0367c1c0 3580bool wxWindowOS2::HandleSysCommand(
61243a51 3581 WXWPARAM wParam
19193a2c 3582, WXLPARAM WXUNUSED(lParam)
61243a51 3583)
0e320a79 3584{
61243a51
DW
3585 //
3586 // 4 bits are reserved
3587 //
3588 switch (SHORT1FROMMP(wParam))
3589 {
3590 case SC_MAXIMIZE:
3591 return HandleMaximize();
3592
3593 case SC_MINIMIZE:
3594 return HandleMinimize();
3595 }
cdf1e714 3596 return FALSE;
0367c1c0 3597} // end of wxWindowOS2::HandleSysCommand
cdf1e714
DW
3598
3599// ---------------------------------------------------------------------------
3600// mouse events
3601// ---------------------------------------------------------------------------
19193a2c 3602//TODO!!! check against MSW
0367c1c0 3603void wxWindowOS2::InitMouseEvent(
61243a51
DW
3604 wxMouseEvent& rEvent
3605, int nX
3606, int nY
3607, WXUINT uFlags
3608)
cdf1e714 3609{
61243a51
DW
3610 rEvent.m_x = nX;
3611 rEvent.m_y = nY;
3612 rEvent.m_shiftDown = ((uFlags & VK_SHIFT) != 0);
3613 rEvent.m_controlDown = ((uFlags & VK_CTRL) != 0);
3614 rEvent.m_leftDown = ((uFlags & VK_BUTTON1) != 0);
3615 rEvent.m_middleDown = ((uFlags & VK_BUTTON3) != 0);
3616 rEvent.m_rightDown = ((uFlags & VK_BUTTON2) != 0);
3617 rEvent.SetTimestamp(s_currentMsg.time);
3618 rEvent.m_eventObject = this;
cdf1e714
DW
3619
3620#if wxUSE_MOUSEEVENT_HACK
61243a51
DW
3621 m_lastMouseX = nX;
3622 m_lastMouseY = nY;
3623 m_lastMouseEvent = rEvent.GetEventType();
cdf1e714 3624#endif // wxUSE_MOUSEEVENT_HACK
0367c1c0 3625} // end of wxWindowOS2::InitMouseEvent
0e320a79 3626
0367c1c0 3627bool wxWindowOS2::HandleMouseEvent(
61243a51
DW
3628 WXUINT uMsg
3629, int nX
3630, int nY
3631, WXUINT uFlags
3632)
0e320a79 3633{
61243a51
DW
3634 //
3635 // The mouse events take consecutive IDs from WM_MOUSEFIRST to
cdf1e714
DW
3636 // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST
3637 // from the message id and take the value in the table to get wxWin event
3638 // id
61243a51 3639 //
cdf1e714
DW
3640 static const wxEventType eventsMouse[] =
3641 {
3642 wxEVT_MOTION,
3643 wxEVT_LEFT_DOWN,
3644 wxEVT_LEFT_UP,
3645 wxEVT_LEFT_DCLICK,
3646 wxEVT_RIGHT_DOWN,
3647 wxEVT_RIGHT_UP,
3648 wxEVT_RIGHT_DCLICK,
3649 wxEVT_MIDDLE_DOWN,
3650 wxEVT_MIDDLE_UP,
3651 wxEVT_MIDDLE_DCLICK
3652 };
3653
61243a51 3654 wxMouseEvent vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]);
cdf1e714 3655
61243a51
DW
3656 InitMouseEvent( vEvent
3657 ,nX
3658 ,nY
3659 ,uFlags
3660 );
0e320a79 3661
61243a51 3662 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3663} // end of wxWindowOS2::HandleMouseEvent
61243a51 3664
0367c1c0 3665bool wxWindowOS2::HandleMouseMove(
61243a51
DW
3666 int nX
3667, int nY
3668, WXUINT uFlags
3669)
0e320a79 3670{
61243a51 3671 if (!m_bMouseInWindow)
cdf1e714 3672 {
61243a51 3673 //
cdf1e714 3674 // Generate an ENTER event
61243a51 3675 //
776d87d5 3676 m_bMouseInWindow = TRUE;
cdf1e714 3677
61243a51 3678 wxMouseEvent vEvent(wxEVT_ENTER_WINDOW);
cdf1e714 3679
61243a51
DW
3680 InitMouseEvent( vEvent
3681 ,nX
3682 ,nY
3683 ,uFlags
3684 );
cdf1e714 3685
61243a51 3686 (void)GetEventHandler()->ProcessEvent(vEvent);
cdf1e714 3687 }
61243a51
DW
3688 return HandleMouseEvent( WM_MOUSEMOVE
3689 ,nX
3690 ,nY
3691 ,uFlags
3692 );
0367c1c0 3693} // end of wxWindowOS2::HandleMouseMove
0e320a79 3694
cdf1e714
DW
3695// ---------------------------------------------------------------------------
3696// keyboard handling
3697// ---------------------------------------------------------------------------
3698
61243a51
DW
3699//
3700// Create the key event of the given type for the given key - used by
3701// HandleChar and HandleKeyDown/Up
3702//
0367c1c0 3703wxKeyEvent wxWindowOS2::CreateKeyEvent(
61243a51
DW
3704 wxEventType eType
3705, int nId
3706, WXLPARAM lParam
3707) const
3708{
3709 wxKeyEvent vEvent(eType);
3710
3711 vEvent.SetId(GetId());
3712 vEvent.m_shiftDown = IsShiftDown();
3713 vEvent.m_controlDown = IsCtrlDown();
3714 vEvent.m_altDown = (HIWORD(lParam) & KC_ALT) == KC_ALT;
3715
3716 vEvent.m_eventObject = (wxWindow *)this; // const_cast
3717 vEvent.m_keyCode = nId;
3718 vEvent.SetTimestamp(s_currentMsg.time);
3719
3720 //
3721 // Translate the position to client coords
3722 //
3723 POINTL vPoint;
3724 RECTL vRect;
3725
3726 ::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
3727 ::WinQueryWindowRect( GetHwnd()
3728 ,&vRect
3729 );
3730
3731 vPoint.x -= vRect.xLeft;
3732 vPoint.y -= vRect.yBottom;
3733
3734 vEvent.m_x = vPoint.x;
3735 vEvent.m_y = vPoint.y;
3736
3737 return vEvent;
0367c1c0 3738} // end of wxWindowOS2::CreateKeyEvent
61243a51
DW
3739
3740//
cdf1e714
DW
3741// isASCII is TRUE only when we're called from WM_CHAR handler and not from
3742// WM_KEYDOWN one
61243a51 3743//
0367c1c0 3744bool wxWindowOS2::HandleChar(
987da0d4 3745 WXDWORD wParam
61243a51
DW
3746, WXLPARAM lParam
3747, bool isASCII
3748)
86de7616 3749{
61243a51
DW
3750 bool bCtrlDown = FALSE;
3751 int vId;
3752
3753 if (isASCII)
3754 {
3755 //
3756 // If 1 -> 26, translate to CTRL plus a letter.
3757 //
3758 vId = wParam;
3759 if ((vId > 0) && (vId < 27))
3760 {
3761 switch (vId)
3762 {
3763 case 13:
3764 vId = WXK_RETURN;
3765 break;
3766
3767 case 8:
3768 vId = WXK_BACK;
3769 break;
3770
3771 case 9:
3772 vId = WXK_TAB;
3773 break;
3774
3775 default:
3776 bCtrlDown = TRUE;
3777 vId = vId + 96;
3778 }
3779 }
3780 }
3781 else if ( (vId = wxCharCodeOS2ToWX(wParam)) == 0)
3782 {
3783 //
3784 // It's ASCII and will be processed here only when called from
3785 // WM_CHAR (i.e. when isASCII = TRUE), don't process it now
3786 //
3787 vId = -1;
3788 }
3789
3790 if (vId != -1)
3791 {
3792 wxKeyEvent vEvent(CreateKeyEvent( wxEVT_CHAR
3793 ,vId
3794 ,lParam
3795 ));
3796
3797 if (bCtrlDown)
3798 {
3799 vEvent.m_controlDown = TRUE;
3800 }
3801
3802 if (GetEventHandler()->ProcessEvent(vEvent))
3803 return TRUE;
3804 }
3805 return FALSE;
cdf1e714 3806}
86de7616 3807
0367c1c0 3808bool wxWindowOS2::HandleKeyDown(
61243a51
DW
3809 WXWORD wParam
3810, WXLPARAM lParam
3811)
cdf1e714 3812{
61243a51 3813 int nId = wxCharCodeOS2ToWX(wParam);
86de7616 3814
61243a51
DW
3815 if (!nId)
3816 {
3817 //
3818 // Normal ASCII char
3819 //
3820 nId = wParam;
3821 }
3822
3823 if (nId != -1)
3824 {
3825 wxKeyEvent vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
3826 ,nId
3827 ,lParam
3828 ));
3829
3830 if (GetEventHandler()->ProcessEvent(vEvent))
3831 {
3832 return TRUE;
3833 }
3834 }
3835 return FALSE;
0367c1c0 3836} // end of wxWindowOS2::HandleKeyDown
61243a51 3837
0367c1c0 3838bool wxWindowOS2::HandleKeyUp(
987da0d4 3839 WXDWORD wParam
61243a51
DW
3840, WXLPARAM lParam
3841)
86de7616 3842{
61243a51
DW
3843 int nId = wxCharCodeOS2ToWX(wParam);
3844
3845 if (!nId)
3846 {
3847 //
3848 // Normal ASCII char
3849 //
3850 nId = wParam;
3851 }
3852
3853 if (nId != -1)
3854 {
3855 wxKeyEvent vEvent(CreateKeyEvent( wxEVT_KEY_UP
3856 ,nId
3857 ,lParam
3858 ));
3859
3860 if (GetEventHandler()->ProcessEvent(vEvent))
3861 return TRUE;
3862 }
3863 return FALSE;
0367c1c0 3864} // end of wxWindowOS2::HandleKeyUp
86de7616 3865
cdf1e714
DW
3866// ---------------------------------------------------------------------------
3867// joystick
3868// ---------------------------------------------------------------------------
86de7616 3869
cdf1e714
DW
3870// ---------------------------------------------------------------------------
3871// scrolling
3872// ---------------------------------------------------------------------------
3873
0367c1c0 3874bool wxWindowOS2::OS2OnScroll(
61243a51
DW
3875 int nOrientation
3876, WXWORD wParam
3877, WXWORD wPos
3878, WXHWND hControl
3879)
cdf1e714 3880{
61243a51 3881 if (hControl)
86de7616 3882 {
61243a51
DW
3883 wxWindow* pChild = wxFindWinFromHandle(hControl);
3884
3885 if (pChild )
3886 return pChild->OS2OnScroll( nOrientation
3887 ,wParam
3888 ,wPos
3889 ,hControl
3890 );
cdf1e714 3891 }
86de7616 3892
61243a51
DW
3893 wxScrollWinEvent vEvent;
3894
3895 vEvent.SetPosition(wPos);
3896 vEvent.SetOrientation(nOrientation);
3897 vEvent.m_eventObject = this;
3898
3899 switch (wParam)
3900 {
3901 case SB_LINEUP:
3902 vEvent.m_eventType = wxEVT_SCROLLWIN_LINEUP;
3903 break;
3904
3905 case SB_LINEDOWN:
3906 vEvent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN;
3907 break;
3908
3909 case SB_PAGEUP:
3910 vEvent.m_eventType = wxEVT_SCROLLWIN_PAGEUP;
3911 break;
3912
3913 case SB_PAGEDOWN:
3914 vEvent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN;
3915 break;
3916
3917 case SB_SLIDERPOSITION:
3918 vEvent.m_eventType = wxEVT_SCROLLWIN_THUMBRELEASE;
3919 break;
3920
3921 case SB_SLIDERTRACK:
3922 vEvent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
3923 break;
3924
3925 default:
3926 return FALSE;
3927 }
3928 return GetEventHandler()->ProcessEvent(vEvent);
0367c1c0 3929} // end of wxWindowOS2::OS2OnScroll
86de7616 3930
cdf1e714
DW
3931// ===========================================================================
3932// global functions
3933// ===========================================================================
3934
61243a51 3935void wxGetCharSize(
987da0d4
DW
3936 WXHWND hWnd
3937, int* pX
3938, int* pY
19193a2c 3939,wxFont* WXUNUSED(pTheFont)
61243a51 3940)
cdf1e714 3941{
987da0d4
DW
3942 FONTMETRICS vFM;
3943 HPS hPS;
3944 BOOL rc;
3945
3946 hPS =::WinGetPS(hWnd);
3947
3948 rc = ::GpiQueryFontMetrics(hPS, sizeof(FONTMETRICS), &vFM);
3949 if (rc)
3950 {
3951 if (pX)
3952 *pX = vFM.lAveCharWidth;
3953 if (pY)
3954 *pY = vFM.lEmHeight + vFM.lExternalLeading;
3955 }
3956 else
3957 {
3958 if (pX)
3959 *pX = 10;
3960 if (pY)
3961 *pY = 15;
3962 }
3963 ::WinReleasePS(hPS);
61243a51 3964} // end of wxGetCharSize
cdf1e714 3965
61243a51 3966//
cdf1e714
DW
3967// Returns 0 if was a normal ASCII value, not a special key. This indicates that
3968// the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
61243a51
DW
3969//
3970int wxCharCodeOS2ToWX(
3971 int nKeySym
3972)
cdf1e714 3973{
61243a51
DW
3974 int nId = 0;
3975
3976 switch (nKeySym)
3977 {
3978 case VK_BACKTAB: nId = WXK_BACK; break;
3979 case VK_TAB: nId = WXK_TAB; break;
3980 case VK_CLEAR: nId = WXK_CLEAR; break;
3981 case VK_ENTER: nId = WXK_RETURN; break;
3982 case VK_SHIFT: nId = WXK_SHIFT; break;
3983 case VK_CTRL: nId = WXK_CONTROL; break;
3984 case VK_PAUSE: nId = WXK_PAUSE; break;
3985 case VK_SPACE: nId = WXK_SPACE; break;
3986 case VK_ESC: nId = WXK_ESCAPE; break;
3987 case VK_END: nId = WXK_END; break;
3988 case VK_HOME : nId = WXK_HOME; break;
3989 case VK_LEFT : nId = WXK_LEFT; break;
3990 case VK_UP: nId = WXK_UP; break;
3991 case VK_RIGHT: nId = WXK_RIGHT; break;
3992 case VK_DOWN : nId = WXK_DOWN; break;
3993 case VK_PRINTSCRN: nId = WXK_PRINT; break;
3994 case VK_INSERT: nId = WXK_INSERT; break;
3995 case VK_DELETE: nId = WXK_DELETE; break;
3996 case VK_F1: nId = WXK_F1; break;
3997 case VK_F2: nId = WXK_F2; break;
3998 case VK_F3: nId = WXK_F3; break;
3999 case VK_F4: nId = WXK_F4; break;
4000 case VK_F5: nId = WXK_F5; break;
4001 case VK_F6: nId = WXK_F6; break;
4002 case VK_F7: nId = WXK_F7; break;
4003 case VK_F8: nId = WXK_F8; break;
4004 case VK_F9: nId = WXK_F9; break;
4005 case VK_F10: nId = WXK_F10; break;
4006 case VK_F11: nId = WXK_F11; break;
4007 case VK_F12: nId = WXK_F12; break;
4008 case VK_F13: nId = WXK_F13; break;
4009 case VK_F14: nId = WXK_F14; break;
4010 case VK_F15: nId = WXK_F15; break;
4011 case VK_F16: nId = WXK_F16; break;
4012 case VK_F17: nId = WXK_F17; break;
4013 case VK_F18: nId = WXK_F18; break;
4014 case VK_F19: nId = WXK_F19; break;
4015 case VK_F20: nId = WXK_F20; break;
4016 case VK_F21: nId = WXK_F21; break;
4017 case VK_F22: nId = WXK_F22; break;
4018 case VK_F23: nId = WXK_F23; break;
4019 case VK_F24: nId = WXK_F24; break;
4020 case VK_NUMLOCK: nId = WXK_NUMLOCK; break;
4021 case VK_SCRLLOCK: nId = WXK_SCROLL; break;
4022 default:
86de7616 4023 {
cdf1e714 4024 return 0;
86de7616
DW
4025 }
4026 }
61243a51
DW
4027 return nId;
4028} // end of wxCharCodeOS2ToWX
86de7616 4029
61243a51
DW
4030int wxCharCodeWXToOS2(
4031 int nId
4032, bool* bIsVirtual
4033)
86de7616 4034{
61243a51
DW
4035 int nKeySym = 0;
4036
4037 *bIsVirtual = TRUE;
4038 switch (nId)
4039 {
4040 case WXK_CLEAR: nKeySym = VK_CLEAR; break;
4041 case WXK_SHIFT: nKeySym = VK_SHIFT; break;
4042 case WXK_CONTROL: nKeySym = VK_CTRL; break;
4043 case WXK_PAUSE: nKeySym = VK_PAUSE; break;
4044 case WXK_END: nKeySym = VK_END; break;
4045 case WXK_HOME : nKeySym = VK_HOME; break;
4046 case WXK_LEFT : nKeySym = VK_LEFT; break;
4047 case WXK_UP: nKeySym = VK_UP; break;
4048 case WXK_RIGHT: nKeySym = VK_RIGHT; break;
4049 case WXK_DOWN : nKeySym = VK_DOWN; break;
4050 case WXK_PRINT: nKeySym = VK_PRINTSCRN; break;
4051 case WXK_INSERT: nKeySym = VK_INSERT; break;
4052 case WXK_DELETE: nKeySym = VK_DELETE; break;
4053 case WXK_F1: nKeySym = VK_F1; break;
4054 case WXK_F2: nKeySym = VK_F2; break;
4055 case WXK_F3: nKeySym = VK_F3; break;
4056 case WXK_F4: nKeySym = VK_F4; break;
4057 case WXK_F5: nKeySym = VK_F5; break;
4058 case WXK_F6: nKeySym = VK_F6; break;
4059 case WXK_F7: nKeySym = VK_F7; break;
4060 case WXK_F8: nKeySym = VK_F8; break;
4061 case WXK_F9: nKeySym = VK_F9; break;
4062 case WXK_F10: nKeySym = VK_F10; break;
4063 case WXK_F11: nKeySym = VK_F11; break;
4064 case WXK_F12: nKeySym = VK_F12; break;
4065 case WXK_F13: nKeySym = VK_F13; break;
4066 case WXK_F14: nKeySym = VK_F14; break;
4067 case WXK_F15: nKeySym = VK_F15; break;
4068 case WXK_F16: nKeySym = VK_F16; break;
4069 case WXK_F17: nKeySym = VK_F17; break;
4070 case WXK_F18: nKeySym = VK_F18; break;
4071 case WXK_F19: nKeySym = VK_F19; break;
4072 case WXK_F20: nKeySym = VK_F20; break;
4073 case WXK_F21: nKeySym = VK_F21; break;
4074 case WXK_F22: nKeySym = VK_F22; break;
4075 case WXK_F23: nKeySym = VK_F23; break;
4076 case WXK_F24: nKeySym = VK_F24; break;
4077 case WXK_NUMLOCK: nKeySym = VK_NUMLOCK; break;
4078 case WXK_SCROLL: nKeySym = VK_SCRLLOCK; break;
4079 default:
cdf1e714 4080 {
61243a51
DW
4081 *bIsVirtual = FALSE;
4082 nKeySym = nId;
cdf1e714
DW
4083 break;
4084 }
86de7616 4085 }
61243a51
DW
4086 return nKeySym;
4087} // end of wxCharCodeWXToOS2
86de7616 4088
61243a51 4089wxWindow* wxGetActiveWindow()
cdf1e714 4090{
61243a51 4091 HWND hWnd = ::WinQueryActiveWindow(HWND_DESKTOP);
86de7616 4092
61243a51
DW
4093 if (hWnd != 0)
4094 {
4095 return wxFindWinFromHandle((WXHWND)hWnd);
4096 }
4097 return NULL;
4098} // end of wxGetActiveWindow
cdf1e714
DW
4099
4100#ifdef __WXDEBUG__
61243a51
DW
4101const char* wxGetMessageName(
4102 int nMessage)
cdf1e714 4103{
61243a51 4104 switch (nMessage)
86de7616 4105 {
cdf1e714
DW
4106 case 0x0000: return "WM_NULL";
4107 case 0x0001: return "WM_CREATE";
4108 case 0x0002: return "WM_DESTROY";
61243a51
DW
4109 case 0x0004: return "WM_ENABLE";
4110 case 0x0005: return "WM_SHOW";
4111 case 0x0006: return "WM_MOVE";
4112 case 0x0007: return "WM_SIZE";
4113 case 0x0008: return "WM_ADJUSTWINDOWPOS";
4114 case 0x0009: return "WM_CALCVALIDRECTS";
4115 case 0x000A: return "WM_SETWINDOWPARAMS";
4116 case 0x000B: return "WM_QUERYWINDOWPARAMS";
4117 case 0x000C: return "WM_HITTEST";
4118 case 0x000D: return "WM_ACTIVATE";
4119 case 0x000F: return "WM_SETFOCUS";
4120 case 0x0010: return "WM_SETSELECTION";
4121 case 0x0011: return "WM_PPAINT";
4122 case 0x0012: return "WM_PSETFOCUS";
4123 case 0x0013: return "WM_PSYSCOLORCHANGE";
4124 case 0x0014: return "WM_PSIZE";
4125 case 0x0015: return "WM_PACTIVATE";
4126 case 0x0016: return "WM_PCONTROL";
4127 case 0x0020: return "WM_COMMAND";
4128 case 0x0021: return "WM_SYSCOMMAND";
4129 case 0x0022: return "WM_HELP";
4130 case 0x0023: return "WM_PAINT";
4131 case 0x0024: return "WM_TIMER";
4132 case 0x0025: return "WM_SEM1";
4133 case 0x0026: return "WM_SEM2";
4134 case 0x0027: return "WM_SEM3";
4135 case 0x0028: return "WM_SEM4";
4136 case 0x0029: return "WM_CLOSE";
4137 case 0x002A: return "WM_QUIT";
4138 case 0x002B: return "WM_SYSCOLORCHANGE";
4139 case 0x002D: return "WM_SYSVALUECHANGE";
4140 case 0x002E: return "WM_APPTERMINATENOTIFY";
4141 case 0x002F: return "WM_PRESPARAMCHANGED";
4142 // Control notification messages
4143 case 0x0030: return "WM_CONTROL";
4144 case 0x0031: return "WM_VSCROLL";
4145 case 0x0032: return "WM_HSCROLL";
4146 case 0x0033: return "WM_INITMENU";
4147 case 0x0034: return "WM_MENUSELECT";
4148 case 0x0035: return "WM_MENUSEND";
4149 case 0x0036: return "WM_DRAWITEM";
4150 case 0x0037: return "WM_MEASUREITEM";
4151 case 0x0038: return "WM_CONTROLPOINTER";
4152 case 0x003A: return "WM_QUERYDLGCODE";
4153 case 0x003B: return "WM_INITDLG";
4154 case 0x003C: return "WM_SUBSTITUTESTRING";
4155 case 0x003D: return "WM_MATCHMNEMONIC";
4156 case 0x003E: return "WM_SAVEAPPLICATION";
4157 case 0x0129: return "WM_CTLCOLORCHANGE";
4158 case 0x0130: return "WM_QUERYCTLTYPE";
4159 // Frame messages
4160 case 0x0040: return "WM_FLASHWINDOW";
4161 case 0x0041: return "WM_FORMATFRAME";
4162 case 0x0042: return "WM_UPDATEFRAME";
4163 case 0x0043: return "WM_FOCUSCHANGE";
4164 case 0x0044: return "WM_SETBORDERSIZE";
4165 case 0x0045: return "WM_TRACKFRAME";
4166 case 0x0046: return "WM_MINMAXFRAME";
4167 case 0x0047: return "WM_SETICON";
4168 case 0x0048: return "WM_QUERYICON";
4169 case 0x0049: return "WM_SETACCELTABLE";
4170 case 0x004A: return "WM_QUERYACCELTABLE";
4171 case 0x004B: return "WM_TRANSLATEACCEL";
4172 case 0x004C: return "WM_QUERYTRACKINFO";
4173 case 0x004D: return "WM_QUERYBORDERSIZE";
4174 case 0x004E: return "WM_NEXTMENU";
4175 case 0x004F: return "WM_ERASEBACKGROUND";
4176 case 0x0050: return "WM_QUERYFRAMEINFO";
4177 case 0x0051: return "WM_QUERYFOCUSCHAIN";
4178 case 0x0052: return "WM_OWNERPOSCHANGE";
4179 case 0x0053: return "WM_CACLFRAMERECT";
4180 case 0x0055: return "WM_WINDOWPOSCHANGED";
4181 case 0x0056: return "WM_ADJUSTFRAMEPOS";
4182 case 0x0059: return "WM_QUERYFRAMECTLCOUNT";
4183 case 0x005B: return "WM_QUERYHELPINFO";
4184 case 0x005C: return "WM_SETHELPINFO";
4185 case 0x005D: return "WM_ERROR";
4186 case 0x005E: return "WM_REALIZEPALETTE";
4187 // Clipboard messages
4188 case 0x0060: return "WM_RENDERFMT";
4189 case 0x0061: return "WM_RENDERALLFMTS";
4190 case 0x0062: return "WM_DESTROYCLIPBOARD";
4191 case 0x0063: return "WM_PAINTCLIPBOARD";
4192 case 0x0064: return "WM_SIZECLIPBOARD";
4193 case 0x0065: return "WM_HSCROLLCLIPBOARD";
4194 case 0x0066: return "WM_VSCROLLCLIPBOARD";
4195 case 0x0067: return "WM_DRAWCLIPBOARD";
4196 // mouse messages
4197 case 0x0070: return "WM_MOUSEMOVE";
4198 case 0x0071: return "WM_BUTTON1DOWN";
4199 case 0x0072: return "WM_BUTTON1UP";
4200 case 0x0073: return "WM_BUTTON1DBLCLK";
4201 case 0x0074: return "WM_BUTTON2DOWN";
4202 case 0x0075: return "WM_BUTTON2UP";
4203 case 0x0076: return "WM_BUTTON2DBLCLK";
4204 case 0x0077: return "WM_BUTTON3DOWN";
4205 case 0x0078: return "WM_BUTTON3UP";
4206 case 0x0079: return "WM_BUTTON3DBLCLK";
4207 case 0x007D: return "WM_MOUSEMAP";
4208 case 0x007E: return "WM_VRNDISABLED";
4209 case 0x007F: return "WM_VRNENABLED";
4210 case 0x0410: return "WM_CHORD";
4211 case 0x0411: return "WM_BUTTON1MOTIONSTART";
4212 case 0x0412: return "WM_BUTTON1MOTIONEND";
4213 case 0x0413: return "WM_BUTTON1CLICK";
4214 case 0x0414: return "WM_BUTTON2MOTIONSTART";
4215 case 0x0415: return "WM_BUTTON2MOTIONEND";
4216 case 0x0416: return "WM_BUTTON2CLICK";
4217 case 0x0417: return "WM_BUTTON3MOTIONSTART";
4218 case 0x0418: return "WM_BUTTON3MOTIONEND";
4219 case 0x0419: return "WM_BUTTON3CLICK";
4220 case 0x0420: return "WM_BEGINDRAG";
4221 case 0x0421: return "WM_ENDDRAG";
4222 case 0x0422: return "WM_SINGLESELECT";
4223 case 0x0423: return "WM_OPEN";
4224 case 0x0424: return "WM_CONTEXTMENU";
4225 case 0x0425: return "WM_CONTEXTHELP";
4226 case 0x0426: return "WM_TEXTEDIT";
4227 case 0x0427: return "WM_BEGINSELECT";
4228 case 0x0228: return "WM_ENDSELECT";
4229 case 0x0429: return "WM_PICKUP";
4230 case 0x04C0: return "WM_PENFIRST";
4231 case 0x04FF: return "WM_PENLAST";
4232 case 0x0500: return "WM_MMPMFIRST";
4233 case 0x05FF: return "WM_MMPMLAST";
4234 case 0x0600: return "WM_STDDLGFIRST";
4235 case 0x06FF: return "WM_STDDLGLAST";
4236 case 0x0BD0: return "WM_BIDI_FIRST";
4237 case 0x0BFF: return "WM_BIDI_LAST";
4238 // keyboard input
4239 case 0x007A: return "WM_CHAR";
4240 case 0x007B: return "WM_VIOCHAR";
4241 // DDE messages
4242 case 0x00A0: return "WM_DDE_INITIATE";
4243 case 0x00A1: return "WM_DDE_REQUEST";
4244 case 0x00A2: return "WM_DDE_ACK";
4245 case 0x00A3: return "WM_DDE_DATA";
4246 case 0x00A4: return "WM_DDE_ADVISE";
4247 case 0x00A5: return "WM_DDE_UNADVISE";
4248 case 0x00A6: return "WM_DDE_POKE";
4249 case 0x00A7: return "WM_DDE_EXECUTE";
4250 case 0x00A8: return "WM_DDE_TERMINATE";
4251 case 0x00A9: return "WM_DDE_INITIATEACK";
4252 case 0x00AF: return "WM_DDE_LAST";
4253 // Buttons
4254 case 0x0120: return "BM_CLICK";
4255 case 0x0121: return "BM_QUERYCHECKINDEX";
4256 case 0x0122: return "BM_QUERYHILITE";
4257 case 0x0123: return "BM_SETHILITE";
4258 case 0x0124: return "BM_QUERYCHECK";
4259 case 0x0125: return "BM_SETCHECK";
4260 case 0x0126: return "BM_SETDEFAULT";
4261 case 0x0128: return "BM_AUTOSIZE";
4262 // Combo boxes
4263 case 0x029A: return "CBID_LIST";
4264 case 0x029B: return "CBID_EDIT";
4265 case 0x0170: return "CBM_SHOWLIST";
4266 case 0x0171: return "CBM_HILITE";
4267 case 0x0172: return "CBM_ISLISTSHOWING";
4268 // Edit fields
4269 case 0x0140: return "EM_QUERYCHANGED";
4270 case 0x0141: return "EM_QUERYSEL";
4271 case 0x0142: return "EM_SETSEL";
4272 case 0x0143: return "EM_SETTEXTLIMIT";
4273 case 0x0144: return "EM_CUT";
4274 case 0x0145: return "EM_COPY";
4275 case 0x0146: return "EM_CLEAR";
4276 case 0x0147: return "EM_PASTE";
4277 case 0x0148: return "EM_QUERYFIRSTCHAR";
4278 case 0x0149: return "EM_SETFIRSTCHAR";
4279 case 0x014A: return "EM_QUERYREADONLY";
4280 case 0x014B: return "EM_SETREADONLY";
4281 case 0x014C: return "EM_SETINSERTMODE";
4282 // Listboxes
4283 case 0x0160: return "LM_QUERYITEMCOUNT";
4284 case 0x0161: return "LM_INSERTITEM";
4285 case 0x0162: return "LM_SETOPENINDEX";
4286 case 0x0163: return "LM_DELETEITEM";
4287 case 0x0164: return "LM_SELECTITEM";
4288 case 0x0165: return "LM_QUERYSELECTION";
4289 case 0x0166: return "LM_SETITEMTEXT";
4290 case 0x0167: return "LM_QUERYITEMTEXTLENGTH";
4291 case 0x0168: return "LM_QUERYITEMTEXT";
4292 case 0x0169: return "LM_SETITEMHANDLE";
4293 case 0x016A: return "LM_QUERYITEMHANDLE";
4294 case 0x016B: return "LM_SEARCHSTRING";
4295 case 0x016C: return "LM_SETITEMHEIGHT";
4296 case 0x016D: return "LM_QUERYTOPINDEX";
4297 case 0x016E: return "LM_DELETEALL";
4298 case 0x016F: return "LM_INSERTMULITEMS";
4299 case 0x0660: return "LM_SETITEMWIDTH";
4300 // Menus
4301 case 0x0180: return "MM_INSERTITEM";
4302 case 0x0181: return "MM_DELETEITEM";
4303 case 0x0182: return "MM_QUERYITEM";
4304 case 0x0183: return "MM_SETITEM";
4305 case 0x0184: return "MM_QUERYITEMCOUNT";
4306 case 0x0185: return "MM_STARTMENUMODE";
4307 case 0x0186: return "MM_ENDMENUMODE";
4308 case 0x0188: return "MM_REMOVEITEM";
4309 case 0x0189: return "MM_SELECTITEM";
4310 case 0x018A: return "MM_QUERYSELITEMID";
4311 case 0x018B: return "MM_QUERYITEMTEXT";
4312 case 0x018C: return "MM_QUERYITEMTEXTLENGTH";
4313 case 0x018D: return "MM_SETITEMHANDLE";
4314 case 0x018E: return "MM_SETITEMTEXT";
4315 case 0x018F: return "MM_ITEMPOSITIONFROMID";
4316 case 0x0190: return "MM_ITEMIDFROMPOSITION";
4317 case 0x0191: return "MM_QUERYITEMATTR";
4318 case 0x0192: return "MM_SETITEMATTR";
4319 case 0x0193: return "MM_ISITEMVALID";
4320 case 0x0194: return "MM_QUERYITEMRECT";
4321 case 0x0431: return "MM_QUERYDEFAULTITEMID";
4322 case 0x0432: return "MM_SETDEFAULTITEMID";
4323 // Scrollbars
4324 case 0x01A0: return "SBM_SETSCROLLBAR";
4325 case 0x01A1: return "SBM_SETPOS";
4326 case 0x01A2: return "SBM_QUERYPOS";
4327 case 0x01A3: return "SBM_QUERYRANGE";
4328 case 0x01A6: return "SBM_SETTHUMBSIZE";
4329
4330 // Help messages
4331 case 0x0F00: return "WM_HELPBASE";
4332 case 0x0FFF: return "WM_HELPTOP";
4333 // Beginning of user defined messages
4334 case 0x1000: return "WM_USER";
4335
4336 // wxWindows user defined types
cdf1e714
DW
4337
4338 // listview
61243a51 4339 // case 0x1000 + 0: return "LVM_GETBKCOLOR";
cdf1e714
DW
4340 case 0x1000 + 1: return "LVM_SETBKCOLOR";
4341 case 0x1000 + 2: return "LVM_GETIMAGELIST";
4342 case 0x1000 + 3: return "LVM_SETIMAGELIST";
4343 case 0x1000 + 4: return "LVM_GETITEMCOUNT";
4344 case 0x1000 + 5: return "LVM_GETITEMA";
4345 case 0x1000 + 75: return "LVM_GETITEMW";
4346 case 0x1000 + 6: return "LVM_SETITEMA";
4347 case 0x1000 + 76: return "LVM_SETITEMW";
4348 case 0x1000 + 7: return "LVM_INSERTITEMA";
4349 case 0x1000 + 77: return "LVM_INSERTITEMW";
4350 case 0x1000 + 8: return "LVM_DELETEITEM";
4351 case 0x1000 + 9: return "LVM_DELETEALLITEMS";
4352 case 0x1000 + 10: return "LVM_GETCALLBACKMASK";
4353 case 0x1000 + 11: return "LVM_SETCALLBACKMASK";
4354 case 0x1000 + 12: return "LVM_GETNEXTITEM";
4355 case 0x1000 + 13: return "LVM_FINDITEMA";
4356 case 0x1000 + 83: return "LVM_FINDITEMW";
4357 case 0x1000 + 14: return "LVM_GETITEMRECT";
4358 case 0x1000 + 15: return "LVM_SETITEMPOSITION";
4359 case 0x1000 + 16: return "LVM_GETITEMPOSITION";
4360 case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA";
4361 case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW";
4362 case 0x1000 + 18: return "LVM_HITTEST";
4363 case 0x1000 + 19: return "LVM_ENSUREVISIBLE";
4364 case 0x1000 + 20: return "LVM_SCROLL";
4365 case 0x1000 + 21: return "LVM_REDRAWITEMS";
4366 case 0x1000 + 22: return "LVM_ARRANGE";
4367 case 0x1000 + 23: return "LVM_EDITLABELA";
4368 case 0x1000 + 118: return "LVM_EDITLABELW";
4369 case 0x1000 + 24: return "LVM_GETEDITCONTROL";
4370 case 0x1000 + 25: return "LVM_GETCOLUMNA";
4371 case 0x1000 + 95: return "LVM_GETCOLUMNW";
4372 case 0x1000 + 26: return "LVM_SETCOLUMNA";
4373 case 0x1000 + 96: return "LVM_SETCOLUMNW";
4374 case 0x1000 + 27: return "LVM_INSERTCOLUMNA";
4375 case 0x1000 + 97: return "LVM_INSERTCOLUMNW";
4376 case 0x1000 + 28: return "LVM_DELETECOLUMN";
4377 case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH";
4378 case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH";
4379 case 0x1000 + 31: return "LVM_GETHEADER";
4380 case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE";
4381 case 0x1000 + 34: return "LVM_GETVIEWRECT";
4382 case 0x1000 + 35: return "LVM_GETTEXTCOLOR";
4383 case 0x1000 + 36: return "LVM_SETTEXTCOLOR";
4384 case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR";
4385 case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR";
4386 case 0x1000 + 39: return "LVM_GETTOPINDEX";
4387 case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE";
4388 case 0x1000 + 41: return "LVM_GETORIGIN";
4389 case 0x1000 + 42: return "LVM_UPDATE";
4390 case 0x1000 + 43: return "LVM_SETITEMSTATE";
4391 case 0x1000 + 44: return "LVM_GETITEMSTATE";
4392 case 0x1000 + 45: return "LVM_GETITEMTEXTA";
4393 case 0x1000 + 115: return "LVM_GETITEMTEXTW";
4394 case 0x1000 + 46: return "LVM_SETITEMTEXTA";
4395 case 0x1000 + 116: return "LVM_SETITEMTEXTW";
4396 case 0x1000 + 47: return "LVM_SETITEMCOUNT";
4397 case 0x1000 + 48: return "LVM_SORTITEMS";
4398 case 0x1000 + 49: return "LVM_SETITEMPOSITION32";
4399 case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT";
4400 case 0x1000 + 51: return "LVM_GETITEMSPACING";
4401 case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA";
4402 case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW";
4403 case 0x1000 + 53: return "LVM_SETICONSPACING";
4404 case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE";
4405 case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE";
4406 case 0x1000 + 56: return "LVM_GETSUBITEMRECT";
4407 case 0x1000 + 57: return "LVM_SUBITEMHITTEST";
4408 case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY";
4409 case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY";
4410 case 0x1000 + 60: return "LVM_SETHOTITEM";
4411 case 0x1000 + 61: return "LVM_GETHOTITEM";
4412 case 0x1000 + 62: return "LVM_SETHOTCURSOR";
4413 case 0x1000 + 63: return "LVM_GETHOTCURSOR";
4414 case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT";
4415 case 0x1000 + 65: return "LVM_SETWORKAREA";
4416
4417 // tree view
4418 case 0x1100 + 0: return "TVM_INSERTITEMA";
4419 case 0x1100 + 50: return "TVM_INSERTITEMW";
4420 case 0x1100 + 1: return "TVM_DELETEITEM";
4421 case 0x1100 + 2: return "TVM_EXPAND";
4422 case 0x1100 + 4: return "TVM_GETITEMRECT";
4423 case 0x1100 + 5: return "TVM_GETCOUNT";
4424 case 0x1100 + 6: return "TVM_GETINDENT";
4425 case 0x1100 + 7: return "TVM_SETINDENT";
4426 case 0x1100 + 8: return "TVM_GETIMAGELIST";
4427 case 0x1100 + 9: return "TVM_SETIMAGELIST";
4428 case 0x1100 + 10: return "TVM_GETNEXTITEM";
4429 case 0x1100 + 11: return "TVM_SELECTITEM";
4430 case 0x1100 + 12: return "TVM_GETITEMA";
4431 case 0x1100 + 62: return "TVM_GETITEMW";
4432 case 0x1100 + 13: return "TVM_SETITEMA";
4433 case 0x1100 + 63: return "TVM_SETITEMW";
4434 case 0x1100 + 14: return "TVM_EDITLABELA";
4435 case 0x1100 + 65: return "TVM_EDITLABELW";
4436 case 0x1100 + 15: return "TVM_GETEDITCONTROL";
4437 case 0x1100 + 16: return "TVM_GETVISIBLECOUNT";
4438 case 0x1100 + 17: return "TVM_HITTEST";
4439 case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE";
4440 case 0x1100 + 19: return "TVM_SORTCHILDREN";
4441 case 0x1100 + 20: return "TVM_ENSUREVISIBLE";
4442 case 0x1100 + 21: return "TVM_SORTCHILDRENCB";
4443 case 0x1100 + 22: return "TVM_ENDEDITLABELNOW";
4444 case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA";
4445 case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW";
4446 case 0x1100 + 24: return "TVM_SETTOOLTIPS";
4447 case 0x1100 + 25: return "TVM_GETTOOLTIPS";
4448
4449 // header
4450 case 0x1200 + 0: return "HDM_GETITEMCOUNT";
4451 case 0x1200 + 1: return "HDM_INSERTITEMA";
4452 case 0x1200 + 10: return "HDM_INSERTITEMW";
4453 case 0x1200 + 2: return "HDM_DELETEITEM";
4454 case 0x1200 + 3: return "HDM_GETITEMA";
4455 case 0x1200 + 11: return "HDM_GETITEMW";
4456 case 0x1200 + 4: return "HDM_SETITEMA";
4457 case 0x1200 + 12: return "HDM_SETITEMW";
4458 case 0x1200 + 5: return "HDM_LAYOUT";
4459 case 0x1200 + 6: return "HDM_HITTEST";
4460 case 0x1200 + 7: return "HDM_GETITEMRECT";
4461 case 0x1200 + 8: return "HDM_SETIMAGELIST";
4462 case 0x1200 + 9: return "HDM_GETIMAGELIST";
4463 case 0x1200 + 15: return "HDM_ORDERTOINDEX";
4464 case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE";
4465 case 0x1200 + 17: return "HDM_GETORDERARRAY";
4466 case 0x1200 + 18: return "HDM_SETORDERARRAY";
4467 case 0x1200 + 19: return "HDM_SETHOTDIVIDER";
4468
4469 // tab control
4470 case 0x1300 + 2: return "TCM_GETIMAGELIST";
4471 case 0x1300 + 3: return "TCM_SETIMAGELIST";
4472 case 0x1300 + 4: return "TCM_GETITEMCOUNT";
4473 case 0x1300 + 5: return "TCM_GETITEMA";
4474 case 0x1300 + 60: return "TCM_GETITEMW";
4475 case 0x1300 + 6: return "TCM_SETITEMA";
4476 case 0x1300 + 61: return "TCM_SETITEMW";
4477 case 0x1300 + 7: return "TCM_INSERTITEMA";
4478 case 0x1300 + 62: return "TCM_INSERTITEMW";
4479 case 0x1300 + 8: return "TCM_DELETEITEM";
4480 case 0x1300 + 9: return "TCM_DELETEALLITEMS";
4481 case 0x1300 + 10: return "TCM_GETITEMRECT";
4482 case 0x1300 + 11: return "TCM_GETCURSEL";
4483 case 0x1300 + 12: return "TCM_SETCURSEL";
4484 case 0x1300 + 13: return "TCM_HITTEST";
4485 case 0x1300 + 14: return "TCM_SETITEMEXTRA";
4486 case 0x1300 + 40: return "TCM_ADJUSTRECT";
4487 case 0x1300 + 41: return "TCM_SETITEMSIZE";
4488 case 0x1300 + 42: return "TCM_REMOVEIMAGE";
4489 case 0x1300 + 43: return "TCM_SETPADDING";
4490 case 0x1300 + 44: return "TCM_GETROWCOUNT";
4491 case 0x1300 + 45: return "TCM_GETTOOLTIPS";
4492 case 0x1300 + 46: return "TCM_SETTOOLTIPS";
4493 case 0x1300 + 47: return "TCM_GETCURFOCUS";
4494 case 0x1300 + 48: return "TCM_SETCURFOCUS";
4495 case 0x1300 + 49: return "TCM_SETMINTABWIDTH";
4496 case 0x1300 + 50: return "TCM_DESELECTALL";
4497
4498 // toolbar
61243a51
DW
4499 case WM_USER+1000+1: return "TB_ENABLEBUTTON";
4500 case WM_USER+1000+2: return "TB_CHECKBUTTON";
4501 case WM_USER+1000+3: return "TB_PRESSBUTTON";
4502 case WM_USER+1000+4: return "TB_HIDEBUTTON";
4503 case WM_USER+1000+5: return "TB_INDETERMINATE";
4504 case WM_USER+1000+9: return "TB_ISBUTTONENABLED";
4505 case WM_USER+1000+10: return "TB_ISBUTTONCHECKED";
4506 case WM_USER+1000+11: return "TB_ISBUTTONPRESSED";
4507 case WM_USER+1000+12: return "TB_ISBUTTONHIDDEN";
4508 case WM_USER+1000+13: return "TB_ISBUTTONINDETERMINATE";
4509 case WM_USER+1000+17: return "TB_SETSTATE";
4510 case WM_USER+1000+18: return "TB_GETSTATE";
4511 case WM_USER+1000+19: return "TB_ADDBITMAP";
4512 case WM_USER+1000+20: return "TB_ADDBUTTONS";
4513 case WM_USER+1000+21: return "TB_INSERTBUTTON";
4514 case WM_USER+1000+22: return "TB_DELETEBUTTON";
4515 case WM_USER+1000+23: return "TB_GETBUTTON";
4516 case WM_USER+1000+24: return "TB_BUTTONCOUNT";
4517 case WM_USER+1000+25: return "TB_COMMANDTOINDEX";
4518 case WM_USER+1000+26: return "TB_SAVERESTOREA";
4519 case WM_USER+1000+76: return "TB_SAVERESTOREW";
4520 case WM_USER+1000+27: return "TB_CUSTOMIZE";
4521 case WM_USER+1000+28: return "TB_ADDSTRINGA";
4522 case WM_USER+1000+77: return "TB_ADDSTRINGW";
4523 case WM_USER+1000+29: return "TB_GETITEMRECT";
4524 case WM_USER+1000+30: return "TB_BUTTONSTRUCTSIZE";
4525 case WM_USER+1000+31: return "TB_SETBUTTONSIZE";
4526 case WM_USER+1000+32: return "TB_SETBITMAPSIZE";
4527 case WM_USER+1000+33: return "TB_AUTOSIZE";
4528 case WM_USER+1000+35: return "TB_GETTOOLTIPS";
4529 case WM_USER+1000+36: return "TB_SETTOOLTIPS";
4530 case WM_USER+1000+37: return "TB_SETPARENT";
4531 case WM_USER+1000+39: return "TB_SETROWS";
4532 case WM_USER+1000+40: return "TB_GETROWS";
4533 case WM_USER+1000+42: return "TB_SETCMDID";
4534 case WM_USER+1000+43: return "TB_CHANGEBITMAP";
4535 case WM_USER+1000+44: return "TB_GETBITMAP";
4536 case WM_USER+1000+45: return "TB_GETBUTTONTEXTA";
4537 case WM_USER+1000+75: return "TB_GETBUTTONTEXTW";
4538 case WM_USER+1000+46: return "TB_REPLACEBITMAP";
4539 case WM_USER+1000+47: return "TB_SETINDENT";
4540 case WM_USER+1000+48: return "TB_SETIMAGELIST";
4541 case WM_USER+1000+49: return "TB_GETIMAGELIST";
4542 case WM_USER+1000+50: return "TB_LOADIMAGES";
4543 case WM_USER+1000+51: return "TB_GETRECT";
4544 case WM_USER+1000+52: return "TB_SETHOTIMAGELIST";
4545 case WM_USER+1000+53: return "TB_GETHOTIMAGELIST";
4546 case WM_USER+1000+54: return "TB_SETDISABLEDIMAGELIST";
4547 case WM_USER+1000+55: return "TB_GETDISABLEDIMAGELIST";
4548 case WM_USER+1000+56: return "TB_SETSTYLE";
4549 case WM_USER+1000+57: return "TB_GETSTYLE";
4550 case WM_USER+1000+58: return "TB_GETBUTTONSIZE";
4551 case WM_USER+1000+59: return "TB_SETBUTTONWIDTH";
4552 case WM_USER+1000+60: return "TB_SETMAXTEXTROWS";
4553 case WM_USER+1000+61: return "TB_GETTEXTROWS";
4554 case WM_USER+1000+41: return "TB_GETBITMAPFLAGS";
cdf1e714
DW
4555
4556 default:
4557 static char s_szBuf[128];
61243a51 4558 sprintf(s_szBuf, "<unknown message = %d>", nMessage);
cdf1e714 4559 return s_szBuf;
86de7616 4560 }
cdf1e714 4561 return NULL;
61243a51 4562} // end of wxGetMessageName
86de7616 4563
11e59d47
DW
4564#endif // __WXDEBUG__
4565
19193a2c
KB
4566// Unused?
4567#if 0
61243a51
DW
4568static void TranslateKbdEventToMouse(
4569 wxWindow* pWin
4570, int* pX
4571, int* pY
4572, ULONG* pFlags
4573)
4574{
4575 //
4576 // Construct the key mask
4577 ULONG& fwKeys = *pFlags;
4578
4579 fwKeys = VK_BUTTON2;
4580 if ((::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x100) != 0)
4581 fwKeys |= VK_CTRL;
4582 if ((::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x100) != 0)
4583 fwKeys |= VK_SHIFT;
4584
4585 //
4586 // Simulate right mouse button click
4587 //
4588 POINTL vPoint;
4589
4590 ::WinQueryMsgPos(vHabmain, &vPoint);
4591 *pX = vPoint.x;
4592 *pY = vPoint.y;
4593
4594 pWin->ScreenToClient(pX, pY);
4595} // end of TranslateKbdEventToMouse
19193a2c 4596#endif
61243a51 4597
cd212ee4
DW
4598// Find the wxWindow at the current mouse position, returning the mouse
4599// position.
f44fdfb0 4600wxWindow* wxFindWindowAtPointer(
19193a2c 4601 wxPoint& WXUNUSED(rPt)
f44fdfb0 4602)
cd212ee4
DW
4603{
4604 return wxFindWindowAtPoint(wxGetMousePosition());
4605}
4606
f44fdfb0
DW
4607wxWindow* wxFindWindowAtPoint(
4608 const wxPoint& rPt
4609)
cd212ee4 4610{
f44fdfb0 4611 POINTL vPt2;
cd212ee4 4612
f44fdfb0
DW
4613 vPt2.x = rPt.x;
4614 vPt2.y = rPt.y;
cd212ee4 4615
f44fdfb0
DW
4616 HWND hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE);
4617 wxWindow* pWin = wxFindWinFromHandle((WXHWND)hWndHit) ;
4618 HWND hWnd = hWndHit;
4619
4620 //
cd212ee4 4621 // Try to find a window with a wxWindow associated with it
f44fdfb0
DW
4622 //
4623 while (!pWin && (hWnd != 0))
cd212ee4 4624 {
f44fdfb0
DW
4625 hWnd = ::WinQueryWindow(hWnd, QW_PARENT);
4626 pWin = wxFindWinFromHandle((WXHWND)hWnd) ;
cd212ee4 4627 }
f44fdfb0 4628 return pWin;
cd212ee4
DW
4629}
4630
f44fdfb0
DW
4631// Get the current mouse position.
4632wxPoint wxGetMousePosition()
4633{
4634 POINTL vPt;
4635
4636 ::WinQueryPointerPos(HWND_DESKTOP, &vPt);
4637 return wxPoint(vPt.x, vPt.y);
4638}
cd212ee4 4639