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