]> git.saurik.com Git - wxWidgets.git/commitdiff
More OS/2 stuff
authorDavid Webster <Dave.Webster@bhmi.com>
Tue, 12 Oct 1999 22:49:24 +0000 (22:49 +0000)
committerDavid Webster <Dave.Webster@bhmi.com>
Tue, 12 Oct 1999 22:49:24 +0000 (22:49 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3945 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

19 files changed:
include/wx/dataobj.h
include/wx/listctrl.h
include/wx/os2/msgdlg.h
include/wx/os2/notebook.h
include/wx/os2/palette.h
include/wx/os2/pen.h
include/wx/os2/radiobox.h
include/wx/os2/radiobut.h
include/wx/os2/window.h
include/wx/printdlg.h
src/os2/makefile.va
src/os2/msgdlg.cpp
src/os2/notebook.cpp
src/os2/palette.cpp
src/os2/pen.cpp
src/os2/print.cpp
src/os2/radiobox.cpp
src/os2/radiobut.cpp
src/os2/window.cpp

index 0e9659bfc55a7763d0d058bee0caf80c0874fdaf..48f84bca8d84c3ca0b79c6e0e24753ba41e0bc52 100644 (file)
@@ -23,7 +23,7 @@
 #elif defined(__WXMAC__)
     #include "wx/mac/dnd.h"
 #elif defined(__WXPM__)
-    #include "wx/os2/dataobj.h"
+    #include "wx/os2/dnd.h"
 #elif defined(__WXSTUBS__)
     #include "wx/stubs/dnd.h"
 #endif
index 0c394197279c57a778701dcc6c009f847aed0b10..1fae7de843fd06798ae8f0b40b752471677b1e5d 100644 (file)
@@ -16,7 +16,7 @@
 #elif defined(__WXMAC__)
 #include "wx/generic/listctrl.h"
 #elif defined(__WXPM__)
-#include "wx/generic/listctrl.h"
+#include "wx/os2/listctrl.h"
 #elif defined(__WXSTUBS__)
 #include "wx/generic/listctrl.h"
 #endif
@@ -38,7 +38,7 @@ public:
     wxPoint       m_pointDrag;
 
     wxListItem    m_item;
-    
+
     inline int GetCode() { return m_code; }
     inline long GetIndex() { return m_itemIndex; }
     inline long GetOldIndex() { return m_oldItemIndex; }
index 58fa8e51ae571267a98c103d8c659c66e23a3088..0855e17f812388ad86776180c7dbc04dafd6b434 100644 (file)
@@ -2,21 +2,17 @@
 // Name:        msgdlg.h
 // Purpose:     wxMessageDialog class. Use generic version if no
 //              platform-specific implementation.
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
 // Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_MSGBOXDLG_H_
 #define _WX_MSGBOXDLG_H_
 
-#ifdef __GNUG__
-#pragma interface "msgdlg.h"
-#endif
-
 #include "wx/setup.h"
 #include "wx/dialog.h"
 
index 18b0793da201a93c99693c17e0a48cb92b0e6611..fece36062dc9251ddca224d9f9bed8158ba37fd9 100644 (file)
@@ -1,26 +1,22 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        notebook.h
 // Purpose:     MSW/GTK compatible notebook (a.k.a. property sheet)
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_NOTEBOOK_H_
 #define _WX_NOTEBOOK_H_
 
-#ifdef __GNUG__
-#pragma interface "notebook.h"
-#endif
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
-#include "wx/dynarray.h"
-#include "wx/event.h"
-#include "wx/control.h"
+#ifndef   _DYNARRAY_H
+  #include <wx/dynarray.h>
+#endif  //_DYNARRAY_H
 
 // ----------------------------------------------------------------------------
 // types
@@ -31,38 +27,17 @@ class WXDLLEXPORT wxImageList;
 class WXDLLEXPORT wxWindow;
 
 // array of notebook pages
-typedef wxWindow wxNotebookPage;  // so far, any window can be a page
+typedef wxWindow WXDLLEXPORT wxNotebookPage;  // so far, any window can be a page
 WX_DEFINE_ARRAY(wxNotebookPage *, wxArrayPages);
 
-// ----------------------------------------------------------------------------
-// notebook events
-// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxNotebookEvent : public wxCommandEvent
-{
-public:
-  wxNotebookEvent(wxEventType commandType = wxEVT_NULL, int id = 0, 
-                  int nSel = -1, int nOldSel = -1)
-    : wxCommandEvent(commandType, id) { m_nSel = nSel; m_nOldSel = nOldSel; }
-
-  // accessors
-  int GetSelection() const { return m_nSel; }
-  int GetOldSelection() const { return m_nOldSel; }
-
-private:
-  int m_nSel,     // currently selected page
-      m_nOldSel;  // previously selected page
-
-  DECLARE_DYNAMIC_CLASS(wxNotebookEvent)
-};
-
 // ----------------------------------------------------------------------------
 // wxNotebook
 // ----------------------------------------------------------------------------
 
-// @@@ this class should really derive from wxTabCtrl, but the interface is not
-//     exactly the same, so I can't do it right now and instead we reimplement
-//     part of wxTabCtrl here
-class wxNotebook : public wxControl
+// FIXME this class should really derive from wxTabCtrl, but the interface is not
+//       exactly the same, so I can't do it right now and instead we reimplement
+//       part of wxTabCtrl here
+class WXDLLEXPORT wxNotebook : public wxControl
 {
 public:
   // ctors
@@ -71,14 +46,14 @@ public:
   wxNotebook();
     // the same arguments as for wxControl (@@@ any special styles?)
   wxNotebook(wxWindow *parent,
-             wxWindowID id, 
+             wxWindowID id,
              const wxPoint& pos = wxDefaultPosition,
              const wxSize& size = wxDefaultSize,
              long style = 0,
              const wxString& name = "notebook");
     // Create() function
   bool Create(wxWindow *parent,
-              wxWindowID id, 
+              wxWindowID id,
               const wxPoint& pos = wxDefaultPosition,
               const wxSize& size = wxDefaultSize,
               long style = 0,
@@ -128,9 +103,6 @@ public:
     // set the padding between tabs (in pixels)
   void SetPadding(const wxSize& padding);
 
-    // Sets the size of the tabs (assumes all tabs are the same size)
-  void SetTabSize(const wxSize& sz);
-
   // operations
   // ----------
     // remove one page from the notebook
@@ -154,16 +126,20 @@ public:
     // get the panel which represents the given page
   wxNotebookPage *GetPage(int nPage) { return m_aPages[nPage]; }
 
+    // Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH
+    // style.
+  void SetTabSize(const wxSize& sz);
+
   // callbacks
   // ---------
   void OnSize(wxSizeEvent& event);
   void OnSelChange(wxNotebookEvent& event);
   void OnSetFocus(wxFocusEvent& event);
   void OnNavigationKey(wxNavigationKeyEvent& event);
-  
+
   // base class virtuals
   // -------------------
-  virtual void Command(wxCommandEvent& event);
+  virtual bool OS2OnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
   virtual void SetConstraintSizes(bool recurse = TRUE);
   virtual bool DoPhase(int nPhase);
 
@@ -183,27 +159,4 @@ protected:
   DECLARE_EVENT_TABLE()
 };
 
-// ----------------------------------------------------------------------------
-// event macros
-// ----------------------------------------------------------------------------
-typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&);
-
-#define EVT_NOTEBOOK_PAGE_CHANGED(id, fn)                                   \
-  {                                                                         \
-    wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,                                    \
-    id,                                                                     \
-    -1,                                                                     \
-    (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn,  \
-    NULL                                                                    \
-  },
-
-#define EVT_NOTEBOOK_PAGE_CHANGING(id, fn)                                  \
-  {                                                                         \
-    wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, \                                 \
-    id,                                                                     \
-    -1,                                                                     \
-    (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn,  \
-    NULL                                                                    \
-  },
-
 #endif // _WX_NOTEBOOK_H_
index 3482b339341aa25b7df0f354f1ed9f7b0f998b68..621fcf2dd920e5891bbfb9beca20ac4f226db3ad 100644 (file)
@@ -1,21 +1,17 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        palette.h
 // Purpose:     wxPalette class
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PALETTE_H_
 #define _WX_PALETTE_H_
 
-#ifdef __GNUG__
-#pragma interface "palette.h"
-#endif
-
 #include "wx/gdiobj.h"
 
 class WXDLLEXPORT wxPalette;
@@ -26,10 +22,8 @@ class WXDLLEXPORT wxPaletteRefData: public wxGDIRefData
 public:
     wxPaletteRefData();
     ~wxPaletteRefData();
-/* TODO: implementation
 protected:
  WXHPALETTE m_hPalette;
-*/
 };
 
 #define M_PALETTEDATA ((wxPaletteRefData *)m_refData)
@@ -54,11 +48,15 @@ public:
   inline bool operator == (const wxPalette& palette) { return m_refData == palette.m_refData; }
   inline bool operator != (const wxPalette& palette) { return m_refData != palette.m_refData; }
 
-/* TODO: implementation
+  virtual bool FreeResource(bool force = FALSE);
+
   inline WXHPALETTE GetHPALETTE() const { return (M_PALETTEDATA ? M_PALETTEDATA->m_hPalette : 0); }
   void SetHPALETTE(WXHPALETTE pal);
-*/
 };
 
+#define wxColorMap wxPalette
+#define wxColourMap wxPalette
+
 #endif
     // _WX_PALETTE_H_
+
index 938908b56be96ad67d784c31278619e7fd13ef5a..5c0b38ec68ec937583d7a9dfbc28b099602e7347 100644 (file)
@@ -1,23 +1,18 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        pen.h
 // Purpose:     wxPen class
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/10/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PEN_H_
 #define _WX_PEN_H_
 
-#ifdef __GNUG__
-#pragma interface "pen.h"
-#endif
-
 #include "wx/gdiobj.h"
-#include "wx/colour.h"
 #include "wx/bitmap.h"
 
 typedef    long wxDash ;
@@ -41,9 +36,7 @@ protected:
   int           m_nbDash ;
   wxDash *      m_dash ;
   wxColour      m_colour;
-/* TODO: implementation
   WXHPEN        m_hPen;
-*/
 };
 
 #define M_PENDATA ((wxPenRefData *)m_refData)
@@ -91,9 +84,9 @@ public:
 
   // Useful helper: create the brush resource
   bool RealizeResource();
-
-  // When setting properties, we must make sure we're not changing
-  // another object
+  bool FreeResource(bool force = FALSE);
+  WXHANDLE GetResourceHandle() ;
+  bool IsFree() const;
   void Unshare();
 };
 
index 7150b569f5e98f135c239e023a0dbfaa5206c20d..f483123cc43529e1c4e8d702c4e7b428c0cfa980 100644 (file)
@@ -1,21 +1,17 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobox.h
 // Purpose:     wxRadioBox class
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_RADIOBOX_H_
 #define _WX_RADIOBOX_H_
 
-#ifdef __GNUG__
-#pragma interface "radiobox.h"
-#endif
-
 #include "wx/control.h"
 
 WXDLLEXPORT_DATA(extern const char*) wxRadioBoxNameStr;
@@ -46,17 +42,20 @@ public:
              int majorDim = 0, long style = wxRA_HORIZONTAL,
              const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr);
 
+  virtual bool OS2Command(WXUINT param, WXWORD id);
+
   int FindString(const wxString& s) const;
   void SetSelection(int N);
   int GetSelection() const;
   wxString GetString(int N) const;
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
+
   void GetSize(int *x, int *y) const;
   void GetPosition(int *x, int *y) const;
-  wxString GetLabel() const;
+
   void SetLabel(const wxString& label);
   void SetLabel(int item, const wxString& label) ;
   wxString GetLabel(int item) const;
+  wxString GetLabel() const;
   bool Show(bool show);
   void SetFocus();
   bool Enable(bool enable);
@@ -74,14 +73,20 @@ public:
   inline void SetNumberOfRowsOrCols(int n) { m_noRowsOrCols = n; }
 
 protected:
-/* TODO: implementation
+  void SubclassRadioButton(WXHWND hWndBtn);
+
   WXHWND *          m_radioButtons;
-*/
   int               m_majorDim ;
+  int *             m_radioWidth;  // for bitmaps
+  int *             m_radioHeight;
+
   int               m_noItems;
   int               m_noRowsOrCols;
   int               m_selectedButton;
 
+  virtual void DoSetSize(int x, int y,
+                         int width, int height,
+                         int sizeFlags = wxSIZE_AUTO);
 };
 
 #endif
index 8e8bf1313d37f062d16a793722c5f996ad76204a..4d4e48a5798da0383912906d82d12e85f197bb92 100644 (file)
@@ -1,21 +1,17 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobut.h
 // Purpose:     wxRadioButton class
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     01/02/97
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_RADIOBUT_H_
 #define _WX_RADIOBUT_H_
 
-#ifdef __GNUG__
-#pragma interface "radiobut.h"
-#endif
-
 #include "wx/control.h"
 
 WXDLLEXPORT_DATA(extern const char*) wxRadioButtonNameStr;
@@ -47,11 +43,11 @@ class WXDLLEXPORT wxRadioButton: public wxControl
   virtual void SetValue(bool val);
   virtual bool GetValue() const ;
 
+  bool OS2Command(WXUINT param, WXWORD id);
   void Command(wxCommandEvent& event);
 };
 
 // Not implemented
-#if 0
 class WXDLLEXPORT wxBitmap ;
 
 WXDLLEXPORT_DATA(extern const char*) wxBitmapRadioButtonNameStr;
@@ -83,8 +79,11 @@ class WXDLLEXPORT wxBitmapRadioButton: public wxRadioButton
   virtual void SetLabel(const wxBitmap *label);
   virtual void SetValue(bool val) ;
   virtual bool GetValue() const ;
+private:
+  // virtual function hiding suppression, do not use
+  virtual void SetLabel(const wxString& label)
+  { wxRadioButton::SetLabel(label); };
 };
-#endif
 
 #endif
     // _WX_RADIOBUT_H_
index 842c32785a483ae9f96d11c3438a3bb2efbc63f7..3a74134df8600021ed3fa22621e9ac091e1df94a 100644 (file)
@@ -3,63 +3,55 @@
 // Purpose:     wxWindow class
 // Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_WINDOW_H_
 #define _WX_WINDOW_H_
 
-#ifdef __GNUG__
-#pragma interface "window.h"
-#endif
-
-#define INCL_DOS
-#define INCL_PM
-#include <os2.h>
+#define wxUSE_MOUSEEVENT_HACK 0
 
-#define wxKEY_SHIFT     1
-#define wxKEY_CTRL      2
+// ---------------------------------------------------------------------------
+// headers
+// ---------------------------------------------------------------------------
 
 // ---------------------------------------------------------------------------
 // forward declarations
 // ---------------------------------------------------------------------------
 
-class WXDLLEXPORT wxWindow;
 class WXDLLEXPORT wxButton;
 
-#if wxUSE_DRAG_AND_DROP
-class WXDLLEXPORT wxDropTarget;
-#endif
-
-#if wxUSE_WX_RESOURCES
-class WXDLLEXPORT wxResourceTable;
-class WXDLLEXPORT wxItemResource;
-#endif
+// ---------------------------------------------------------------------------
+// constants
+// ---------------------------------------------------------------------------
 
-WXDLLEXPORT_DATA(extern const char*) wxPanelNameStr;
+// FIXME does anybody use those? they're unused by wxWindows...
+enum
+{
+    wxKEY_SHIFT = 1,
+    wxKEY_CTRL  = 2
+};
 
-WXDLLEXPORT_DATA(extern const wxSize) wxDefaultSize;
-WXDLLEXPORT_DATA(extern const wxPoint) wxDefaultPosition;
+// ---------------------------------------------------------------------------
+// wxWindow declaration for OS/2 PM
+// ---------------------------------------------------------------------------
 
-class WXDLLEXPORT wxWindow: public wxWindowBase
+class WXDLLEXPORT wxWindow : public wxWindowBase
 {
-    DECLARE_ABSTRACT_CLASS(wxWindow)
-
-    friend class wxDC;
-    friend class wxPaintDC;
+    DECLARE_DYNAMIC_CLASS(wxWindow);
 
 public:
-    wxWindow() { Init(); };
-    inline wxWindow( wxWindow*       parent
-                    ,wxWindowID      id
-                    ,const wxPoint&  pos = wxDefaultPosition
-                    ,const wxSize&   size = wxDefaultSize
-                    ,long            style = 0
-                    ,const wxString& name = wxPanelNameStr
-                   )
+    wxWindow() { Init(); }
+
+    wxWindow(wxWindow *parent,
+             wxWindowID id,
+             const wxPoint& pos = wxDefaultPosition,
+             const wxSize& size = wxDefaultSize,
+             long style = 0,
+             const wxString& name = wxPanelNameStr)
     {
         Init();
         Create(parent, id, pos, size, style, name);
@@ -67,174 +59,119 @@ public:
 
     virtual ~wxWindow();
 
-    bool Create( wxWindow*       parent
-                ,wxWindowID      id
-                ,const wxPoint&  pos = wxDefaultPosition
-                ,const wxSize&   size = wxDefaultSize
-                ,long            style = 0
-                ,const wxString& name = wxPanelNameStr
-               );
+    bool Create(wxWindow *parent,
+                wxWindowID id,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = 0,
+                const wxString& name = wxPanelNameStr);
 
-// ---------------------------------------------------------------------------
-// wxWindowBase pure virtual implementations
-// ---------------------------------------------------------------------------
+    // implement base class pure virtuals
+    virtual void SetTitle( const wxString& title);
+    virtual wxString GetTitle() const;
 
-    // Z order
     virtual void Raise();
     virtual void Lower();
-    // Set the focus to this window
-    virtual void SetFocus();
-    // Warp the pointer the given position
-    virtual void WarpPointer(int x_pos, int y_pos) ;
-    // Capture/release mouse
-    virtual void CaptureMouse();
-    virtual void ReleaseMouse();
-    // Send the window a refresh event
-    virtual void Refresh(bool eraseBack = TRUE, const wxRect *rect = NULL);
-    // Clear the window
-    virtual void Clear();
-    // Set window's font
-    virtual bool SetFont(const wxFont& f);
-    // Get character size
-    virtual int  GetCharHeight() const;
-    virtual int  GetCharWidth() const;
-    virtual void GetTextExtent( const wxString& string
-                               ,int*            x
-                               ,int*            y
-                               ,int*            descent = NULL
-                               ,int*            externalLeading = NULL
-                               ,const wxFont*   theFont = NULL
-                              ) const;
-
-    // Configure the window's scrollbar
-    virtual void SetScrollbar( int  orient
-                              ,int  pos
-                              ,int  thumbVisible
-                              ,int  range
-                              ,bool refresh = TRUE
-                             );
-    virtual void SetScrollPos( int  orient
-                              ,int  pos
-                              ,bool refresh = TRUE
-                             );
-    virtual int  GetScrollPos(int orient) const;
-    virtual int  GetScrollRange(int orient) const;
-    virtual int  GetScrollThumb(int orient) const;
-    virtual void ScrollWindow( int           dx
-                              ,int           dy
-                              ,const wxRect* rect = NULL
-                             );
-#if wxUSE_DRAG_AND_DROP
-    void         SetDropTarget(wxDropTarget *pDropTarget);
-#endif
-    // coordinates translation
-    virtual void DoClientToScreen( int *x, int *y ) const;
-    virtual void DoScreenToClient( int *x, int *y ) const;
-
-    // retrieve the position/size of the window
-    virtual void DoGetPosition( int *x, int *y ) const;
-    virtual void DoGetSize( int *width, int *height ) const;
-    virtual void DoGetClientSize( int *width, int *height ) const;
 
-    // this is the virtual function to be overriden in any derived class which
-    // wants to change how SetSize() or Move() works - it is called by all
-    // versions of these functions in the base class
-    virtual void DoSetSize(int x, int y,
-                           int width, int height,
-                           int sizeFlags = wxSIZE_AUTO);
-
-    // same as DoSetSize() for the client size
-    virtual void DoSetClientSize(int width, int height);
-    virtual bool DoPopupMenu( wxMenu *menu, int x, int y );
+    virtual bool Show( bool show = TRUE );
+    virtual bool Enable( bool enable = TRUE );
 
-// ---------------------------------------------------------------------------
-// wxWindowBase virtual implementations that need to be overriden
-// ---------------------------------------------------------------------------
-
-    // Fit the window around the items
-    virtual void            Fit();
-    // Show or hide the window
-    virtual bool            Show(bool show); // check if base implementation is OK
-    // Enable or disable the window
-    virtual bool            Enable(bool enable); // check if base implementation is OK
-    // Set the cursor
-    virtual bool            SetCursor(const wxCursor& cursor); // check if base implementation is OK
+    virtual void SetFocus();
 
-// ---------------------------------------------------------------------------
-// additional functions
-// ---------------------------------------------------------------------------
+    virtual bool Reparent( wxWindow *newParent );
 
-    // Dialog support: override these and call
-    // base class members to add functionality
-    // that can't be done using validators.
-    void SetClientSize( int width, int height )
-        { DoSetClientSize(width, height); }
+    virtual void WarpPointer(int x, int y);
+    virtual void CaptureMouse();
+    virtual void ReleaseMouse();
 
-    void SetClientSize( const wxSize& size )
-        { DoSetClientSize(size.x, size.y); }
+    virtual void Refresh( bool eraseBackground = TRUE,
+                          const wxRect *rect = (const wxRect *) NULL );
+    virtual void Clear();
 
-    void SetClientSize(const wxRect& rect)
-        { SetClientSize( rect.width, rect.height ); }
+    virtual bool SetCursor( const wxCursor &cursor );
+    virtual bool SetFont( const wxFont &font );
 
-    // Validate controls. If returns FALSE,
-    // validation failed: don't quit
-    virtual bool Validate();
+    virtual int GetCharHeight() const;
+    virtual int GetCharWidth() const;
+    virtual void GetTextExtent(const wxString& string,
+                               int *x, int *y,
+                               int *descent = (int *) NULL,
+                               int *externalLeading = (int *) NULL,
+                               const wxFont *theFont = (const wxFont *) NULL)
+                               const;
 
-    // Return code for dialogs
-    inline void SetReturnCode(int retCode);
-    inline int GetReturnCode();
+    virtual bool DoPopupMenu( wxMenu *menu, int x, int y );
 
+    virtual void SetScrollbar( int orient, int pos, int thumbVisible,
+                               int range, bool refresh = TRUE );
+    virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE );
+    virtual int GetScrollPos( int orient ) const;
+    virtual int GetScrollThumb( int orient ) const;
+    virtual int GetScrollRange( int orient ) const;
+    virtual void ScrollWindow( int dx, int dy,
+                               const wxRect* rect = (wxRect *) NULL );
 
-    // Get the window with the focus
-    static wxWindow *FindFocus();
+#if wxUSE_DRAG_AND_DROP
+    virtual void SetDropTarget( wxDropTarget *dropTarget );
+#endif // wxUSE_DRAG_AND_DROP
 
     // Accept files for dragging
     virtual void DragAcceptFiles(bool accept);
 
-    // Most windows have the concept of a label; for frames, this is the
-    // title; for items, this is the label or button text.
-    inline virtual wxString GetLabel() const { return GetTitle(); }
+#if WXWIN_COMPATIBILITY
+    // Set/get scroll attributes
+    virtual void SetScrollRange(int orient, int range, bool refresh = TRUE);
+    virtual void SetScrollPage(int orient, int page, bool refresh = TRUE);
+    virtual int OldGetScrollRange(int orient) const;
+    virtual int GetScrollPage(int orient) const;
 
-#if wxUSE_CARET && WXWIN_COMPATIBILITY
-    // Caret manipulation
-    virtual void CreateCaret(int w, int h);
-    virtual void CreateCaret(const wxBitmap *bitmap);
-    virtual void DestroyCaret();
-    virtual void ShowCaret(bool show);
-    virtual void SetCaretPos(int x, int y);
-    virtual void GetCaretPos(int *x, int *y) const;
-#endif
-
-    // Handle a control command
+    // event handlers
+        // Handle a control command
     virtual void OnCommand(wxWindow& win, wxCommandEvent& event);
 
-    // Get the default button, if there is one
-    inline virtual wxButton *GetDefaultItem() const;
-    inline virtual void SetDefaultItem(wxButton *but);
-
-    // Override to define new behaviour for default action (e.g. double clicking
-    // on a listbox)
-    virtual void OnDefaultAction(wxControl *initiatingItem);
-
-    // EventHandlers
-    void OnEraseBackground(wxEraseEvent& event);
-    void OnChar(wxKeyEvent& event);
-    void OnKeyDown(wxKeyEvent& event);
-    void OnKeyUp(wxKeyEvent& event);
-    void OnPaint(wxPaintEvent& event);
-    void OnIdle(wxIdleEvent& event);
+        // Override to define new behaviour for default action (e.g. double
+        // clicking on a listbox)
+    virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { }
+#endif // WXWIN_COMPATIBILITY
 
-    // Accessors
+#if wxUSE_CARET && WXWIN_COMPATIBILITY
+    // caret manipulation (old MSW only functions, see wxCaret class for the
+    // new API)
+    void CreateCaret(int w, int h);
+    void CreateCaret(const wxBitmap *bitmap);
+    void DestroyCaret();
+    void ShowCaret(bool show);
+    void SetCaretPos(int x, int y);
+    void GetCaretPos(int *x, int *y) const;
+#endif // wxUSE_CARET
+
+    // Native resource loading (implemented in src/msw/nativdlg.cpp)
+    // FIXME: should they really be all virtual?
+    virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id);
+    virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name);
+    wxWindow* GetWindowChild1(wxWindowID id);
+    wxWindow* GetWindowChild(wxWindowID id);
+
+    // implementation from now on
+    // --------------------------
+
+    // simple accessors
+    // ----------------
 
     WXHWND GetHWND() const { return m_hWnd; }
-    void   SetHWND(WXHWND hWnd) { m_hWnd = hWnd; }
+    void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; }
     virtual WXWidget GetHandle() const { return GetHWND(); }
 
-public:
-// ---------------------------------------------------------------------------
-// IMPLEMENTATION
-// ---------------------------------------------------------------------------
+    bool GetUseCtl3D() const { return m_useCtl3D; }
+    bool GetTransparentBackground() const { return m_backgroundTransparent; }
+    void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; }
 
+    // event handlers
+    // --------------
+    void OnEraseBackground(wxEraseEvent& event);
+    void OnIdle(wxIdleEvent& event);
+
+public:
     // For implementation purposes - sometimes decorations make the client area
     // smaller
     virtual wxPoint GetClientAreaOrigin() const;
@@ -253,71 +190,236 @@ public:
     wxWindow *FindItem(long id) const;
     wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = FALSE) const;
 
+    // Make a Windows extended style from the given wxWindows window style
+    static WXDWORD MakeExtendedStyle(long style,
+                                     bool eliminateBorders = TRUE);
     // Determine whether 3D effects are wanted
     WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) const;
 
-    // PM only: TRUE if this control is part of the main control
+    // MSW only: TRUE if this control is part of the main control
     virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; };
 
-    // Executes the default message
-    virtual long Default();
+    // returns TRUE if the window has been created
+    bool OS2Create(int id,
+                   wxWindow *parent,
+                   const wxChar *wclass,
+                   wxWindow *wx_win,
+                   const wxChar *title,
+                   int x, int y, int width, int height,
+                   WXDWORD style,
+                   const wxChar *dialog_template = NULL,
+                   WXDWORD exendedStyle = 0);
+    virtual bool OS2Command(WXUINT param, WXWORD id);
+
+#if WXWIN_COMPATIBILITY
+    wxObject *GetChild(int number) const;
+    virtual void OS2DeviceToLogical(float *x, float *y) const;
+#endif // WXWIN_COMPATIBILITY
+
+    // Create an appropriate wxWindow from a HWND
+    virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd);
+
+    // Make sure the window style reflects the HWND style (roughly)
+    virtual void AdoptAttributesFromHWND();
+
+    // Setup background and foreground colours correctly
+    virtual void SetupColours();
+
+    // ------------------------------------------------------------------------
+    // helpers for message handlers: these perform the same function as the
+    // message crackers from <windowsx.h> - they unpack WPARAM and LPARAM into
+    // the correct parameters
+    // ------------------------------------------------------------------------
+
+    void UnpackCommand(WXWPARAM wParam, WXLPARAM lParam,
+                       WXWORD *id, WXHWND *hwnd, WXWORD *cmd);
+    void UnpackActivate(WXWPARAM wParam, WXLPARAM lParam,
+                        WXWORD *state, WXWORD *minimized, WXHWND *hwnd);
+    void UnpackScroll(WXWPARAM wParam, WXLPARAM lParam,
+                      WXWORD *code, WXWORD *pos, WXHWND *hwnd);
+    void UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam,
+                        WXWORD *nCtlColor, WXHDC *hdc, WXHWND *hwnd);
+    void UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam,
+                          WXWORD *item, WXWORD *flags, WXHMENU *hmenu);
+
+    // ------------------------------------------------------------------------
+    // internal handlers for MSW messages: all handlers return a boolen value:
+    // TRUE means that the handler processed the event and FALSE that it didn't
+    // ------------------------------------------------------------------------
+
+    // there are several cases where we have virtual functions for Windows
+    // message processing: this is because these messages often require to be
+    // processed in a different manner in the derived classes. For all other
+    // messages, however, we do *not* have corresponding MSWOnXXX() function
+    // and if the derived class wants to process them, it should override
+    // MSWWindowProc() directly.
+
+    // scroll event (both horizontal and vertical)
+    virtual bool OS2OnScroll(int orientation, WXWORD nSBCode,
+                             WXWORD pos, WXHWND control);
+
+    virtual bool OS2OnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
+
+    // owner-drawn controls need to process these messages
+    virtual bool OS2OnDrawItem(int id, WXDRAWITEMSTRUCT *item);
+    virtual bool OS2OnMeasureItem(int id, WXMEASUREITEMSTRUCT *item);
+
+    // the rest are not virtual
+    bool HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate);
+    bool HandleInitDialog(WXHWND hWndFocus);
+    bool HandleDestroy();
+
+    bool HandlePaint();
+    bool HandleEraseBkgnd(WXHDC pDC);
+
+    bool HandleMinimize();
+    bool HandleMaximize();
+    bool HandleSize(int x, int y, WXUINT flag);
+    bool HandleGetMinMaxInfo(void *mmInfo);
+
+    bool HandleShow(bool show, int status);
+    bool HandleActivate(int flag, bool minimized, WXHWND activate);
+
+    bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control);
+    bool HandleSysCommand(WXWPARAM wParam, WXLPARAM lParam);
+
+    bool HandleCtlColor(WXHBRUSH *hBrush,
+                        WXHDC hdc,
+                        WXHWND hWnd,
+                        WXUINT nCtlColor,
+                        WXUINT message,
+                        WXWPARAM wParam,
+                        WXLPARAM lParam);
+
+    bool HandlePaletteChanged(WXHWND hWndPalChange);
+    bool HandleQueryNewPalette();
+    bool HandleSysColorChange();
+
+    bool HandleQueryEndSession(long logOff, bool *mayEnd);
+    bool HandleEndSession(bool endSession, long logOff);
+
+    bool HandleSetFocus(WXHWND wnd);
+    bool HandleKillFocus(WXHWND wnd);
+
+    bool HandleDropFiles(WXWPARAM wParam);
+
+    bool HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags);
+    bool HandleMouseMove(int x, int y, WXUINT flags);
+
+    bool HandleChar(WXWORD wParam, WXLPARAM lParam, bool isASCII = FALSE);
+    bool HandleKeyDown(WXWORD wParam, WXLPARAM lParam);
+    bool HandleKeyUp(WXWORD wParam, WXLPARAM lParam);
 
-    // Constraint implementation
-    void UnsetConstraints(wxLayoutConstraints *c);
-    // Back-pointer to other windows we're involved with, so if we delete
-    // this window, we must delete any constraints we're involved with.
+    bool HandleQueryDragIcon(WXHICON *hIcon);
+
+    bool HandleSetCursor(WXHWND hWnd, short nHitTest, int mouseMsg);
 
-    wxObject *GetChild(int number) const ;
+    // Window procedure
+    virtual MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
 
-    // Transfers data to any child controls
-    void OnInitDialog(wxInitDialogEvent& event);
+    // Calls an appropriate default window procedure
+    virtual MRESULT OS2DefWindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+    virtual bool OS2ProcessMessage(WXMSG* pMsg);
+    virtual bool OS2TranslateMessage(WXMSG* pMsg);
+    virtual void OS2DestroyWindow();
 
-    virtual MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+    // Detach "Window" menu from menu bar so it doesn't get deleted
+    void OS2DetachWindowMenu();
 
+    // this function should return the brush to paint the window background
+    // with or 0 for the default brush
+    virtual WXHBRUSH OnCtlColor(WXHDC hDC,
+                                WXHWND hWnd,
+                                WXUINT nCtlColor,
+                                WXUINT message,
+                                WXWPARAM wParam,
+                                WXLPARAM lParam);
 
-protected:
+#if WXWIN_COMPATIBILITY
+    void SetShowing(bool show) { (void)Show(show); }
+    bool IsUserEnabled() const { return IsEnabled(); }
+#endif // WXWIN_COMPATIBILITY
 
-    // Caret data
-    int                   m_caretWidth;
-    int                   m_caretHeight;
-    bool                  m_caretEnabled;
-    bool                  m_caretShown;
+    // Responds to colour changes: passes event on to children.
+    void OnSysColourChanged(wxSysColourChangedEvent& event);
 
-    wxButton *            m_defaultItem;
+    // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX)
+    void InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags);
 
-public:
-    WXFARPROC             m_oldWndProc;
-    int                   m_returnCode;
-    bool                  m_isBeingDeleted;
-    bool                  m_isShown;
-    bool                  m_winCaptured;
-    bool                  m_mouseInWindow;
-    bool                  m_backgroundTransparent;
-    // handles
+protected:
+    // the window handle
     WXHWND                m_hWnd;
-    WXHMENU               m_hMenu; // Menu, if any
+
+    // the old window proc (we subclass all windows)
+    WXFARPROC             m_oldWndProc;
+
+    // additional (MSW specific) flags
+    bool                  m_useCtl3D:1; // Using CTL3D for this control
+    bool                  m_backgroundTransparent:1;
+    bool                  m_mouseInWindow:1;
+    bool                  m_doubleClickAllowed:1;
+    bool                  m_winCaptured:1;
 
     // the size of one page for scrolling
     int                   m_xThumbSize;
     int                   m_yThumbSize;
-    long                  m_lDlgCode;
 
-DECLARE_EVENT_TABLE()
+#if wxUSE_MOUSEEVENT_HACK
+    // the coordinates of the last mouse event and the type of it
+    long                  m_lastMouseX,
+                          m_lastMouseY;
+    int                   m_lastMouseEvent;
+#endif // wxUSE_MOUSEEVENT_HACK
+
+    WXHMENU               m_hMenu; // Menu, if any
+
+    // the return value of WM_GETDLGCODE handler
+    long m_lDlgCode;
+
+    // implement the base class pure virtuals
+    virtual void DoClientToScreen( int *x, int *y ) const;
+    virtual void DoScreenToClient( int *x, int *y ) const;
+    virtual void DoGetPosition( int *x, int *y ) const;
+    virtual void DoGetSize( int *width, int *height ) const;
+    virtual void DoGetClientSize( int *width, int *height ) const;
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
+    virtual void DoSetClientSize(int width, int height);
+
+    // get the size which best suits the window: e.g., for a static text it
+    // will be the width and height of the text
+    virtual wxSize DoGetBestSize();
+
+    // move the window to the specified location and resize it: this is called
+    // from both DoSetSize() and DoSetClientSize() and would usually just call
+    // ::MoveWindow() except for composite controls which will want to arrange
+    // themselves inside the given rectangle
+    virtual void DoMoveWindow(int x, int y, int width, int height);
+
+#if wxUSE_TOOLTIPS
+    virtual void DoSetToolTip( wxToolTip *tip );
+#endif // wxUSE_TOOLTIPS
+
 private:
-    void   Init();
-    void   PMDetachWindowMenu();
-};
+    // common part of all ctors
+    void Init();
 
-////////////////////////////////////////////////////////////////////////
-//// INLINES
+    // the (non-virtual) handlers for the events
+    bool HandleMove(int x, int y);
+    bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags);
 
-inline wxButton *wxWindow::GetDefaultItem() const { return m_defaultItem; }
-inline void wxWindow::SetDefaultItem(wxButton *but) { m_defaultItem = but; }
-inline void wxWindow::SetReturnCode(int retCode) { m_returnCode = retCode; }
-inline int wxWindow::GetReturnCode() { return m_returnCode; }
+    bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
+    DECLARE_NO_COPY_CLASS(wxWindow);
+    DECLARE_EVENT_TABLE()
+};
 
-// Get the active window.
-wxWindow* WXDLLEXPORT wxGetActiveWindow();
+// ---------------------------------------------------------------------------
+// global functions
+// ---------------------------------------------------------------------------
 
+// kbd code translation
+WXDLLEXPORT int wxCharCodeOS2ToWX(int keySym);
+WXDLLEXPORT int wxCharCodeWXToOS2(int id, bool *IsVirtual);
 #endif
     // _WX_WINDOW_H_
index 9063c3fb0dae40a5a778440639a77aa5e36e81ec..778488ca6be788ee117ee4b5d766a123974d68d9 100644 (file)
 #elif defined(__WXMAC__)
 #include "wx/mac/printdlg.h"
 #elif defined(__WXPM__)
-#include "wx/os2/printdlg.h"
+#include "wx/generic/prntdlgg.h"
 #elif defined(__WXSTUBS__)
 #include "wx/generic/prntdlgg.h"
 #endif
 
-#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXPM__)
+#if !defined(__WXMSW__) && !defined(__WXMAC__)
 #define wxPrintDialog wxGenericPrintDialog
 #define sm_classwxPrintDialog sm_classwxGenericPrintDialog
 
index 2df25f60e5057d04172730059480cceb10c5267e..b97f8c24444eff31cf8b014973bdc1d99771c05e 100644 (file)
@@ -333,6 +333,16 @@ OS2OBJS = \
   ..\os2\$D\menuitem.obj \
   ..\os2\$D\metafile.obj \
   ..\os2\$D\minifram.obj \
+  ..\os2\$D\msgdlg.obj \
+  ..\os2\$D\nativdlg.obj \
+  ..\os2\$D\notebook.obj \
+  ..\os2\$D\ownerdrw.obj \
+  ..\os2\$D\palette.obj \
+  ..\os2\$D\pen.obj \
+  ..\os2\$D\pngread.obj \
+  ..\os2\$D\print.obj \
+  ..\os2\$D\radiobox.obj \
+  ..\os2\$D\radiobut.obj \
   ..\os2\$D\window.obj
 
 OS2LIBOBJS = \
@@ -380,6 +390,16 @@ OS2LIBOBJS = \
   menuitem.obj \
   metafile.obj \
   minifram.obj \
+  msgdlg.obj \
+  nativdlg.obj \
+  notebook.obj \
+  ownerdrw.obj \
+  palette.obj \
+  pen.obj \
+  pngread.obj \
+  print.obj \
+  radiobox.obj \
+  radiobut.obj \
   window.obj
 
 HTMLOBJS = \
@@ -571,6 +591,16 @@ $(OS2LIBOBJS):
   copy ..\os2\$D\menuitem.obj
   copy ..\os2\$D\metafile.obj
   copy ..\os2\$D\minifram.obj
+  copy ..\os2\$D\msgdlg.obj
+  copy ..\os2\$D\nativdlg.obj
+  copy ..\os2\$D\notebook.obj
+  copy ..\os2\$D\ownerdrw.obj
+  copy ..\os2\$D\pallet.obj
+  copy ..\os2\$D\pen.obj
+  copy ..\os2\$D\pngread.obj
+  copy ..\os2\$D\print.obj
+  copy ..\os2\$D\radiobox.obj
+  copy ..\os2\$D\radiobut.obj
   copy ..\os2\$D\window.obj
 
 # wxWindows library as DLL
index aeaa9bac7ab149bfaf2aa5432038d9bfa9c563d8..af819d103e542800c4b6fd78ef66d7d4d5b85649 100644 (file)
@@ -1,19 +1,33 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        msgdlg.cpp
 // Purpose:     wxMessageDialog
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     04/01/98
+// Created:     10/10/99
 // RCS-ID:      $$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "msgdlg.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include <stdio.h>
+#include "wx/defs.h"
+#include "wx/utils.h"
+#include "wx/dialog.h"
+#include "wx/msgdlg.h"
 #endif
 
-#include "wx/stubs/msgdlg.h"
+#include "wx/os2/private.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define wxDIALOG_DEFAULT_X 300
+#define wxDIALOG_DEFAULT_Y 300
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
index f7ee49cd5d09c1aec3707f8d9685a54308bb94ba..6355b3d9deb9ee8c92cd9dc10d3aea78cda7fc9c 100644 (file)
@@ -1,52 +1,71 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Name:        notebook.cpp
 // Purpose:     implementation of wxNotebook
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by: 
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
+// Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-// ============================================================================
-// declarations
-// ============================================================================
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
-// ----------------------------------------------------------------------------
-// headers
-// ----------------------------------------------------------------------------
-#ifdef __GNUG__
-#pragma implementation "notebook.h"
-#endif
+// wxWindows
+#ifndef WX_PRECOMP
+  #include  <wx/string.h>
+#endif  // WX_PRECOMP
 
-#include  <wx/string.h>
 #include  <wx/log.h>
 #include  <wx/imaglist.h>
+#include  <wx/event.h>
+#include  <wx/control.h>
 #include  <wx/notebook.h>
 
+#include  <wx/os2/private.h>
+
+
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
-
 // check that the page index is valid
 #define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount()))
 
+// hide the ugly cast
+#define m_hwnd    (HWND)GetHWND()
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// This is a work-around for missing defines in gcc-2.95 headers
+#ifndef TCS_RIGHT
+    #define TCS_RIGHT       0x0002
+#endif
+
+#ifndef TCS_VERTICAL
+    #define TCS_VERTICAL    0x0080
+#endif
+
+#ifndef TCS_BOTTOM
+    #define TCS_BOTTOM      TCS_RIGHT
+#endif
+
 // ----------------------------------------------------------------------------
 // event table
 // ----------------------------------------------------------------------------
 
 #if !USE_SHARED_LIBRARIES
-BEGIN_EVENT_TABLE(wxNotebook, wxControl)
+  BEGIN_EVENT_TABLE(wxNotebook, wxControl)
     EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange)
-
     EVT_SIZE(wxNotebook::OnSize)
     EVT_SET_FOCUS(wxNotebook::OnSetFocus)
     EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
-END_EVENT_TABLE()
+  END_EVENT_TABLE()
 
-IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
-IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent)
+  IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
+  IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
 #endif
 
 // ============================================================================
@@ -91,19 +110,53 @@ bool wxNotebook::Create(wxWindow *parent,
                         long style,
                         const wxString& name)
 {
-    // base init
-    SetName(name);
-    SetParent(parent);
+  // base init
+  if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
+      return FALSE;
+
+  // colors and font
+  m_backgroundColour = wxColour(GetSysColor(COLOR_BTNFACE));
+  m_foregroundColour = *wxBLACK ;
+
+    // TODO:
+/*
+  // style
+  m_windowStyle = style | wxTAB_TRAVERSAL;
+
+  long tabStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | TCS_TABS;
+
+  if (m_windowStyle & wxCLIP_CHILDREN)
+    tabStyle |= WS_CLIPCHILDREN;
+  if ( m_windowStyle & wxTC_MULTILINE )
+    tabStyle |= TCS_MULTILINE;
+  if ( m_windowStyle & wxBORDER )
+    tabStyle &= WS_BORDER;
+  if (m_windowStyle & wxNB_FIXEDWIDTH)
+    tabStyle |= TCS_FIXEDWIDTH ;
+  if (m_windowStyle & wxNB_BOTTOM)
+    tabStyle |= TCS_RIGHT;
+  if (m_windowStyle & wxNB_LEFT)
+    tabStyle |= TCS_VERTICAL;
+  if (m_windowStyle & wxNB_RIGHT)
+    tabStyle |= TCS_VERTICAL|TCS_RIGHT;
+        
+
+  if ( !MSWCreate(GetId(), GetParent(), WC_TABCONTROL,
+                  this, NULL, pos.x, pos.y, size.x, size.y,
+                  tabStyle, NULL, 0) )
+  {
+    return FALSE;
+  }
 
-    m_windowId = id == -1 ? NewControlId() : id;
+  // Not all compilers recognise SetWindowFont
+  ::SendMessage(GetHwnd(), WM_SETFONT,
+                (WPARAM)::GetStockObject(DEFAULT_GUI_FONT), TRUE);
 
-    // style
-    m_windowStyle = style;
 
-    if ( parent != NULL )
-        parent->AddChild(this);
-
-    // TODO
+  if ( parent != NULL )
+    parent->AddChild(this);
+*/
+  SubclassWin(m_hWnd);
 
     return FALSE;
 }
@@ -129,7 +182,7 @@ int wxNotebook::GetRowCount() const
 
 int wxNotebook::SetSelection(int nPage)
 {
-    wxASSERT( IS_VALID_PAGE(nPage) );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
 
     ChangePage(m_nSelection, nPage);
 
@@ -149,7 +202,7 @@ void wxNotebook::AdvanceSelection(bool bForward)
 
 bool wxNotebook::SetPageText(int nPage, const wxString& strText)
 {
-    wxASSERT( IS_VALID_PAGE(nPage) );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
 
     // TODO
     return FALSE;
@@ -157,7 +210,7 @@ bool wxNotebook::SetPageText(int nPage, const wxString& strText)
 
 wxString wxNotebook::GetPageText(int nPage) const
 {
-    wxASSERT( IS_VALID_PAGE(nPage) );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), wxT(""), wxT("notebook page out of range") );
 
     // TODO
     return wxString("");
@@ -165,7 +218,7 @@ wxString wxNotebook::GetPageText(int nPage) const
 
 int wxNotebook::GetPageImage(int nPage) const
 {
-    wxASSERT( IS_VALID_PAGE(nPage) );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
 
     // TODO
     return 0;
@@ -173,7 +226,7 @@ int wxNotebook::GetPageImage(int nPage) const
 
 bool wxNotebook::SetPageImage(int nPage, int nImage)
 {
-    wxASSERT( IS_VALID_PAGE(nPage) );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
 
     // TODO
     return FALSE;
@@ -185,6 +238,11 @@ void wxNotebook::SetImageList(wxImageList* imageList)
     // TODO
 }
 
+void wxNotebook::SetTabSize(const wxSize& sz)
+{
+    // TODO
+}
+
 // ----------------------------------------------------------------------------
 // wxNotebook operations
 // ----------------------------------------------------------------------------
@@ -192,7 +250,7 @@ void wxNotebook::SetImageList(wxImageList* imageList)
 // remove one page from the notebook
 bool wxNotebook::DeletePage(int nPage)
 {
-    wxCHECK( IS_VALID_PAGE(nPage), FALSE );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
 
     // TODO: delete native widget page
 
@@ -205,7 +263,7 @@ bool wxNotebook::DeletePage(int nPage)
 // remove one page from the notebook, without deleting the window
 bool wxNotebook::RemovePage(int nPage)
 {
-    wxCHECK( IS_VALID_PAGE(nPage), FALSE );
+    wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
 
     m_aPages.Remove(nPage);
 
@@ -303,8 +361,21 @@ void wxNotebook::OnSelChange(wxNotebookEvent& event)
 {
     // is it our tab control?
     if ( event.GetEventObject() == this )
-        ChangePage(event.GetOldSelection(), event.GetSelection());
-
+    {
+        int sel = event.GetOldSelection();
+        if ( sel != -1 )
+            m_aPages[sel]->Show(FALSE);
+      
+        sel = event.GetSelection();
+        if ( sel != -1 )
+        {
+            wxNotebookPage *pPage = m_aPages[sel];
+            pPage->Show(TRUE);
+            pPage->SetFocus();
+        }
+      
+        m_nSelection = sel;
+  }
     // we want to give others a chance to process this message as well
     event.Skip();
 }
@@ -350,9 +421,33 @@ bool wxNotebook::DoPhase(int /* nPhase */)
     return TRUE;
 }
 
-void wxNotebook::Command(wxCommandEvent& event)
+bool wxNotebook::OS2OnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result)
 {
-    wxFAIL_MSG("wxNotebook::Command not implemented");
+  wxNotebookEvent event(wxEVT_NULL, m_windowId);
+//TODO:
+/*
+  NMHDR* hdr = (NMHDR *)lParam;
+  switch ( hdr->code ) {
+    case TCN_SELCHANGE:
+      event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
+      break;
+
+    case TCN_SELCHANGING:
+      event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING);
+      break;
+
+    default:
+      return wxControl::MSWOnNotify(idCtrl, lParam, result);
+  }
+*/
+    event.SetSelection(TabCtrl_GetCurSel(m_hwnd));
+    event.SetOldSelection(m_nSelection);
+    event.SetEventObject(this);
+    event.SetInt(idCtrl);
+
+    bool processed = GetEventHandler()->ProcessEvent(event);
+    *result = !event.IsAllowed();
+    return processed;
 }
 
 // ----------------------------------------------------------------------------
@@ -362,21 +457,35 @@ void wxNotebook::Command(wxCommandEvent& event)
 // hide the currently active panel and show the new one
 void wxNotebook::ChangePage(int nOldSel, int nSel)
 {
-    wxASSERT( nOldSel != nSel ); // impossible
-
-    if ( nOldSel != -1 ) {
-        m_aPages[nOldSel]->Show(FALSE);
+    // MT-FIXME should use a real semaphore
+    static bool s_bInsideChangePage = FALSE;
+
+    // when we call ProcessEvent(), our own OnSelChange() is called which calls
+    // this function - break the infinite loop
+    if ( s_bInsideChangePage )
+        return;
+
+    // it's not an error (the message may be generated by the tab control itself)
+    // and it may happen - just do nothing
+    if ( nSel == nOldSel )
+        return;
+
+    s_bInsideChangePage = TRUE;
+
+    wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
+    event.SetSelection(nSel);
+    event.SetOldSelection(nOldSel);
+    event.SetEventObject(this);
+    if ( ProcessEvent(event) && !event.IsAllowed() )
+    {
+        // program doesn't allow the page change
+        s_bInsideChangePage = FALSE;
+        return;
     }
 
-    wxNotebookPage *pPage = m_aPages[nSel];
-    pPage->Show(TRUE);
-    pPage->SetFocus();
-
-    m_nSelection = nSel;
-}
+    event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
+    ProcessEvent(event);
 
-void wxNotebook::SetTabSize(const wxSize& sz)
-{
-    // TODO
+    s_bInsideChangePage = FALSE;
 }
 
index f8db96f8d0894b7970275f7565fed661a7516cea..889d289d4b14df9da61eaafb307f5451b1f998b2 100644 (file)
@@ -9,16 +9,22 @@
 // Licence:    wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "palette.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
+#ifndef WX_PRECOMP
+#include <stdio.h>
+#include "wx/setup.h"
 #include "wx/palette.h"
-
-#if !USE_SHARED_LIBRARIES
-IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject)
 #endif
 
+#define INCL_PM
+#define INCL_GPI
+#include <os2.h>
+
+#include "assert.h"
+
+
 /*
  * Palette
  *
@@ -26,12 +32,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject)
 
 wxPaletteRefData::wxPaletteRefData()
 {
-    // TODO
+    m_hPalette = 0;
 }
 
 wxPaletteRefData::~wxPaletteRefData()
 {
-    // TODO
+    if ( m_hPalette )
+        return;
+        // TODO: ::DeleteObject((HPALETTE) m_hPalette);
 }
 
 wxPalette::wxPalette()
@@ -47,6 +55,15 @@ wxPalette::~wxPalette()
 {
 }
 
+bool wxPalette::FreeResource(bool force)
+{
+    if ( M_PALETTEDATA && M_PALETTEDATA->m_hPalette)
+    {
+// TODO:   DeleteObject((HPALETTE)M_PALETTEDATA->m_hPalette);
+    }
+    return TRUE;
+}
+
 bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue)
 {
   UnRef();
@@ -54,8 +71,26 @@ bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *gre
   m_refData = new wxPaletteRefData;
 
   // TODO
-
-  return FALSE;
+/*
+  NPLOGPALETTE npPal = (NPLOGPALETTE)LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) +
+                        (WORD)n * sizeof(PALETTEENTRY));
+  if (!npPal)
+    return(FALSE);
+
+  npPal->palVersion = 0x300;
+  npPal->palNumEntries = n;
+
+  int i;
+  for (i = 0; i < n; i ++)
+  {
+    npPal->palPalEntry[i].peRed = red[i];
+    npPal->palPalEntry[i].peGreen = green[i];
+    npPal->palPalEntry[i].peBlue = blue[i];
+    npPal->palPalEntry[i].peFlags = 0;
+  }
+  M_PALETTEDATA->m_hPalette = (WXHPALETTE) CreatePalette((LPLOGPALETTE)npPal);
+  LocalFree((HANDLE)npPal);
+*/
 }
 
 int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const
@@ -74,9 +109,27 @@ bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsi
 
     if (index < 0 || index > 255)
         return FALSE;
+// TODO
+/*
+  PALETTEENTRY entry;
+  if (::GetPaletteEntries((HPALETTE) M_PALETTEDATA->m_hPalette, index, 1, &entry))
+  {
+         *red = entry.peRed;
+         *green = entry.peGreen;
+         *blue = entry.peBlue;
+         return TRUE;
+  } else
+         return FALSE;
+*/
+  return FALSE;
+}
 
-    // TODO
-    return FALSE;
+void wxPalette::SetHPALETTE(WXHPALETTE pal)
+{
+       if ( !m_refData )
+               m_refData = new wxPaletteRefData;
+
+    M_PALETTEDATA->m_hPalette = pal;
 }
 
 
index 1e3ced2a3a484c777157da7da10c70737831a760..3d6fea538d68c4b21f180a9a2886d68bf457d5fc 100644 (file)
@@ -1,26 +1,29 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        pen.cpp
 // Purpose:     wxPen
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/10/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "pen.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
+#ifndef WX_PRECOMP
+#include <stdio.h>
 #include "wx/setup.h"
+#include "wx/list.h"
 #include "wx/utils.h"
+#include "wx/app.h"
 #include "wx/pen.h"
-
-#if !USE_SHARED_LIBRARIES
-IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
 #endif
 
+#include "wx/os2/private.h"
+#include "assert.h"
+
 wxPenRefData::wxPenRefData()
 {
     m_style = wxSOLID;
@@ -29,9 +32,7 @@ wxPenRefData::wxPenRefData()
     m_cap = wxCAP_ROUND ;
     m_nbDash = 0 ;
     m_dash = 0 ;
-/* TODO: null data
     m_hPen = 0;
-*/
 }
 
 wxPenRefData::wxPenRefData(const wxPenRefData& data)
@@ -73,13 +74,22 @@ wxPen::wxPen(const wxColour& col, int Width, int Style)
     m_refData = new wxPenRefData;
 
     M_PENDATA->m_colour = col;
+//  M_PENDATA->m_stipple = NULL;
     M_PENDATA->m_width = Width;
     M_PENDATA->m_style = Style;
     M_PENDATA->m_join = wxJOIN_ROUND ;
     M_PENDATA->m_cap = wxCAP_ROUND ;
     M_PENDATA->m_nbDash = 0 ;
     M_PENDATA->m_dash = 0 ;
-
+    M_PENDATA->m_hPen = 0 ;
+
+// TODO:
+/*
+    if ((Style == wxDOT) || (Style == wxLONG_DASH) ||
+        (Style == wxSHORT_DASH) || (Style == wxDOT_DASH) ||
+        (Style == wxUSER_DASH))
+        M_PENDATA->m_width = 1;
+*/
     RealizeResource();
 
     if ( wxThePenList )
@@ -97,6 +107,7 @@ wxPen::wxPen(const wxBitmap& stipple, int Width)
     M_PENDATA->m_cap = wxCAP_ROUND ;
     M_PENDATA->m_nbDash = 0 ;
     M_PENDATA->m_dash = 0 ;
+    M_PENDATA->m_hPen = 0 ;
 
     RealizeResource();
 
@@ -104,19 +115,44 @@ wxPen::wxPen(const wxBitmap& stipple, int Width)
         wxThePenList->AddPen(this);
 }
 
+bool wxPen::RealizeResource()
+{
+    // TODO: create actual pen
+    return FALSE;
+}
+
+WXHANDLE wxPen::GetResourceHandle()
+{
+    if ( !M_PENDATA )
+        return 0;
+    else
+        return (WXHANDLE)M_PENDATA->m_hPen;
+}
+
+bool wxPen::FreeResource(bool force)
+{
+    if (M_PENDATA && (M_PENDATA->m_hPen != 0))
+    {
+        DeleteObject((HPEN) M_PENDATA->m_hPen);
+        M_PENDATA->m_hPen = 0;
+        return TRUE;
+    }
+    else return FALSE;
+}
+
 void wxPen::Unshare()
 {
-       // Don't change shared data
-       if (!m_refData)
+    // Don't change shared data
+    if (!m_refData)
     {
-               m_refData = new wxPenRefData();
-       }
+        m_refData = new wxPenRefData();
+    }
     else
     {
-               wxPenRefData* ref = new wxPenRefData(*(wxPenRefData*)m_refData);
-               UnRef();
-               m_refData = ref;
-       }
+        wxPenRefData* ref = new wxPenRefData(*(wxPenRefData*)m_refData);
+        UnRef();
+        m_refData = ref;
+    }
 }
 
 void wxPen::SetColour(const wxColour& col)
@@ -193,10 +229,57 @@ void wxPen::SetCap(int Cap)
     RealizeResource();
 }
 
-bool wxPen::RealizeResource()
+void wxPen::SetCap(int Cap)
 {
-    // TODO: create actual pen
-    return FALSE;
+    Unshare();
+
+    M_PENDATA->m_cap = Cap;
+
+    RealizeResource();
+}
+
+int wx2os2PenStyle(int wx_style)
+{
+    int cstyle;
+// TODO:
+/*
+    switch (wx_style)
+    { 
+       case wxDOT:
+           cstyle = PS_DOT;
+       break;
+
+       case wxDOT_DASH:
+          cstyle = PS_DASHDOT;
+          break;
+
+       case wxSHORT_DASH:
+       case wxLONG_DASH:
+           cstyle = PS_DASH;
+          break;
+
+       case wxTRANSPARENT:
+           cstyle = PS_NULL;
+          break;
+
+       case wxUSER_DASH:
+#ifdef __WIN32__
+           // Win32s doesn't have PS_USERSTYLE
+          if (wxGetOsVersion()==wxWINDOWS_NT || wxGetOsVersion()==wxWIN95)
+              cstyle = PS_USERSTYLE;
+          else
+               cstyle = PS_DOT; // We must make a choice... This is mine!
+#else
+           cstyle = PS_DASH;
+#endif
+           break;
+       case wxSOLID:
+       default:
+           cstyle = PS_SOLID;
+           break;
+   }
+*/
+   return cstyle;
 }
 
 
index 61fd6e7e993835abbbd6d9bd7d9c27a7c9ca03c5..7c95f90a23d877ea8e8ba9416bc70021a74bead2 100644 (file)
@@ -9,12 +9,20 @@
 // Licence:    wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "print.h"
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include <stdio.h>
+#include "wx/setup.h"
+#include "wx/list.h"
+#include "wx/utils.h"
+#include "wx/app.h"
 #endif
 
-#include "wx/stubs/print.h"
-#include "wx/stubs/printdlg.h"
+
+#include "wx/os2/print.h"
+#include "wx/print.h"
+#include "wx/generic/printdlg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxPrinter, wxPrinterBase)
index da582d0e52ef7fcb9755e3b355a3df8dda5785be..9e48ac41d8eb072e00ce10bb6907acf95ff9abc5 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobox.cpp
 // Purpose:     wxRadioBox
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "radiobox.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+    #include <stdio.h>
+    #include "wx/setup.h"
+    #include "wx/bitmap.h"
+    #include "wx/brush.h"
+    #include "wx/radiobox.h"
 #endif
 
-#include "wx/radiobox.h"
+#include "wx/os2/private.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
 #endif
 
+// ---------------------------------------------------------------------------
+// private functions
+// ---------------------------------------------------------------------------
+
+// wnd proc for radio buttons
+MRESULT _EXPORT wxRadioBtnWndProc(HWND hWnd,
+                                  UINT message,
+                                  MPARAM wParam,
+                                  MPARAM lParam);
+
+// ---------------------------------------------------------------------------
+// global vars
+// ---------------------------------------------------------------------------
+
+// the pointer to standard radio button wnd proc
+static s_wndprocRadioBtn = NULL;
+
+// ===========================================================================
+// implementation
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// wxRadioBox
+// ---------------------------------------------------------------------------
+
+int wxRadioBox::GetNumVer() const
+{
+    if ( m_windowStyle & wxRA_SPECIFY_ROWS )
+    {
+        return m_majorDim;
+    }
+    else
+    {
+        return (m_noItems + m_majorDim - 1)/m_majorDim;
+    }
+}
+
+int wxRadioBox::GetNumHor() const
+{
+    if ( m_windowStyle & wxRA_SPECIFY_ROWS )
+    {
+        return (m_noItems + m_majorDim - 1)/m_majorDim;
+    }
+    else
+    {
+        return m_majorDim;
+    }
+}
+
+bool wxRadioBox::OS2Command(WXUINT cmd, WXWORD id)
+{
+// TODO:
+/*
+    if ( cmd == BN_CLICKED )
+    {
+        int selectedButton = -1;
+
+        for ( int i = 0; i < m_noItems; i++ )
+        {
+            if ( id == wxGetWindowId(m_radioButtons[i]) )
+            {
+                selectedButton = i;
+
+                break;
+            }
+        }
+
+        wxASSERT_MSG( selectedButton != -1, wxT("click from alien button?") );
+
+        if ( selectedButton != m_selectedButton )
+        {
+            m_selectedButton = selectedButton;
+
+            SendNotificationEvent();
+        }
+        //else: don't generate events when the selection doesn't change
+
+        return TRUE;
+    }
+    else
+        return FALSE;
+*/
+    return FALSE;
+}
+
+#if WXWIN_COMPATIBILITY
+wxRadioBox::wxRadioBox(wxWindow *parent, wxFunction func, const char *title,
+        int x, int y, int width, int height,
+        int n, char **choices,
+        int majorDim, long style, const char *name)
+{
+    wxString *choices2 = new wxString[n];
+    for ( int i = 0; i < n; i ++) choices2[i] = choices[i];
+    Create(parent, -1, title, wxPoint(x, y), wxSize(width, height), n, choices2, majorDim, style,
+            wxDefaultValidator, name);
+    Callback(func);
+    delete choices2;
+}
+
+#endif
+
 // Radio box item
 wxRadioBox::wxRadioBox()
 {
     m_selectedButton = -1;
     m_noItems = 0;
     m_noRowsOrCols = 0;
-    m_majorDim = 0 ;
+    m_radioButtons = NULL;
+    m_majorDim = 0;
+    m_radioWidth = NULL;
+    m_radioHeight = NULL;
 }
 
 bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
-             const wxPoint& pos, const wxSize& size,
-             int n, const wxString choices[],
-             int majorDim, long style,
-             const wxValidator& val, const wxString& name)
+        const wxPoint& pos, const wxSize& size,
+        int n, const wxString choices[],
+        int majorDim, long style,
+        const wxValidator& val, const wxString& name)
 {
     m_selectedButton = -1;
     m_noItems = n;
@@ -41,56 +152,181 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
     SetValidator(val);
 
     parent->AddChild(this);
+    m_backgroundColour = parent->GetBackgroundColour();
+    m_foregroundColour = parent->GetForegroundColour();
 
     m_windowStyle = (long&)style;
 
+    int x = pos.x;
+    int y = pos.y;
+    int width = size.x;
+    int height = size.y;
+
     if (id == -1)
         m_windowId = NewControlId();
     else
         m_windowId = id;
 
+    if ( majorDim == 0 )
+        m_majorDim = n;
+    else
+        m_majorDim = majorDim;
     m_noRowsOrCols = majorDim;
 
-    if (majorDim==0)
-        m_majorDim = n ;
-    else
-        m_majorDim = majorDim ;
+    long msStyle = GROUP_FLAGS;
+
+    bool want3D;
+    WXDWORD exStyle = Determine3DEffects(0, &want3D);
+
+    HWND hwndParent = (HWND)parent->GetHWND();
+/*
+    m_hWnd = (WXHWND)::CreateWindowEx
+                        (
+                         (DWORD)exStyle,
+                         GROUP_CLASS,
+                         title,
+                         msStyle,
+                         0, 0, 0, 0,
+                         hwndParent,
+                         (HMENU)m_windowId,
+                         wxGetInstance(),
+                         NULL
+                        );
+
+#if wxUSE_CTL3D
+    if (want3D)
+    {
+        Ctl3dSubclassCtl((HWND)m_hWnd);
+        m_useCtl3D = TRUE;
+    }
+#endif // wxUSE_CTL3D
+*/
+    SetFont(parent->GetFont());
+
+    SubclassWin(m_hWnd);
+
+    // Some radio boxes test consecutive id.
+    (void)NewControlId();
+    m_radioButtons = new WXHWND[n];
+    m_radioWidth = new int[n];
+    m_radioHeight = new int[n];
+    int i;
+    for (i = 0; i < n; i++)
+    {
+// TODO:
+/*
+        m_radioWidth[i] = m_radioHeight[i] = -1;
+        long groupStyle = 0;
+        if ( i == 0 && style == 0 )
+            groupStyle = WS_GROUP;
+        long newId = NewControlId();
+        long msStyle = groupStyle | RADIO_FLAGS;
+
+        HWND hwndBtn = CreateWindowEx(exStyle, RADIO_CLASS,
+                                      choices[i], msStyle,
+                                      0,0,0,0,
+                                      hwndParent,
+                                      (HMENU)newId, wxGetInstance(),
+                                      NULL);
+
+        m_radioButtons[i] = (WXHWND)hwndBtn;
+
+        SubclassRadioButton((WXHWND)hwndBtn);
+
+        wxFont& font = GetFont();
+        if ( font.Ok() )
+        {
+            SendMessage(hwndBtn, WM_SETFONT,
+                        (WPARAM)font.GetResourceHandle(), 0L);
+        }
+
+        m_subControls.Append((wxObject *)(WXDWORD)(WXWORD)newId);
+*/
+    }
 
+    // Create a dummy radio control to end the group.
+    (void)CreateWindowEx(0, RADIO_CLASS, wxT(""), WS_GROUP | RADIO_FLAGS,
+                         0, 0, 0, 0, hwndParent,
+                         (HMENU)NewControlId(), wxGetInstance(), NULL);
 
-    // TODO create radiobox
-    return FALSE;
-}
+    SetSelection(0);
 
+    SetSize(x, y, width, height);
+
+    return TRUE;
+}
 
 wxRadioBox::~wxRadioBox()
 {
-    // TODO
+    m_isBeingDeleted = TRUE;
+
+    if (m_radioButtons)
+    {
+        int i;
+// TODO:
+/*
+        for (i = 0; i < m_noItems; i++)
+            ::DestroyWindow((HWND)m_radioButtons[i]);
+        delete[] m_radioButtons;
+*/
+    }
+
+    if (m_radioWidth)
+        delete[] m_radioWidth;
+    if (m_radioHeight)
+        delete[] m_radioHeight;
+
 }
 
 wxString wxRadioBox::GetLabel(int item) const
 {
-    // TODO
-    return wxString("");
+    wxCHECK_MSG( item >= 0 && item < m_noItems, wxT(""), wxT("invalid radiobox index") );
+
+    return wxGetWindowText(m_radioButtons[item]);
 }
 
 void wxRadioBox::SetLabel(int item, const wxString& label)
 {
-    // TODO
+    wxCHECK_RET( item >= 0 && item < m_noItems, wxT("invalid radiobox index") );
+
+    m_radioWidth[item] = m_radioHeight[item] = -1;
+// TODO:    SetWindowText((HWND)m_radioButtons[item], label.c_str());
 }
 
-int wxRadioBox::FindString(const wxString& s) const
+void wxRadioBox::SetLabel(int item, wxBitmap *bitmap)
 {
-    // TODO
-    return -1;
+    /*
+       m_radioWidth[item] = bitmap->GetWidth() + FB_MARGIN;
+       m_radioHeight[item] = bitmap->GetHeight() + FB_MARGIN;
+     */
+    wxFAIL_MSG(wxT("not implemented"));
 }
 
-void wxRadioBox::SetSelection(int n)
+int wxRadioBox::FindString(const wxString& s) const
 {
-    if ((n < 0) || (n >= m_noItems))
-        return;
-    // TODO
+    for (int i = 0; i < m_noItems; i++)
+    {
+        if ( s == wxGetWindowText(m_radioButtons[i]) )
+            return i;
+    }
 
-    m_selectedButton = n;
+    return wxNOT_FOUND;
+}
+
+void wxRadioBox::SetSelection(int N)
+{
+    wxCHECK_RET( (N >= 0) && (N < m_noItems), wxT("invalid radiobox index") );
+
+    // Following necessary for Win32s, because Win32s translate BM_SETCHECK
+// TODO:
+/*
+    if (m_selectedButton >= 0 && m_selectedButton < m_noItems)
+        ::SendMessage((HWND) m_radioButtons[m_selectedButton], BM_SETCHECK, 0, 0L);
+
+    ::SendMessage((HWND)m_radioButtons[N], BM_SETCHECK, 1, 0L);
+    ::SetFocus((HWND)m_radioButtons[N]);
+*/
+    m_selectedButton = N;
 }
 
 // Get single selection, for single choice list items
@@ -100,80 +336,309 @@ int wxRadioBox::GetSelection() const
 }
 
 // Find string for position
-wxString wxRadioBox::GetString(int n) const
+wxString wxRadioBox::GetString(int N) const
 {
-    // TODO
-    return wxString("");
+    return wxGetWindowText(m_radioButtons[N]);
 }
 
-void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
+// Restored old code.
+void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    int currentX, currentY;
+    GetPosition(&currentX, &currentY);
+    int widthOld, heightOld;
+    GetSize(&widthOld, &heightOld);
+
+    int xx = x;
+    int yy = y;
+
+    if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+        xx = currentX;
+    if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+        yy = currentY;
+
+    wxString buf;
+
+    int y_offset = yy;
+    int x_offset = xx;
+    int current_width, cyf;
+
+    int cx1,cy1;
+    wxGetCharSize(m_hWnd, &cx1, &cy1, & GetFont());
+
+    // Attempt to have a look coherent with other platforms: We compute the
+    // biggest toggle dim, then we align all items according this value.
+    int maxWidth =  -1;
+    int maxHeight = -1;
+
+    int i;
+    for (i = 0 ; i < m_noItems; i++)
+    {
+        int eachWidth;
+        int eachHeight;
+        if (m_radioWidth[i]<0)
+        {
+            // It's a labelled toggle
+            buf = wxGetWindowText(m_radioButtons[i]);
+            GetTextExtent(buf, &current_width, &cyf);
+            eachWidth = (int)(current_width + RADIO_SIZE);
+            eachHeight = (int)((3*cyf)/2);
+        }
+        else
+        {
+            eachWidth = m_radioWidth[i];
+            eachHeight = m_radioHeight[i];
+        }
+
+        if (maxWidth<eachWidth)
+            maxWidth = eachWidth;
+        if (maxHeight<eachHeight)
+            maxHeight = eachHeight;
+    }
+
+    if (m_hWnd)
+    {
+        int totWidth;
+        int totHeight;
+
+        int nbHor = GetNumHor(),
+        nbVer = GetNumVer();
+
+        // this formula works, but I don't know why.
+        // Please, be sure what you do if you modify it!!
+        if (m_radioWidth[0]<0)
+            totHeight = (nbVer * maxHeight) + cy1/2;
+        else
+            totHeight = nbVer * (maxHeight+cy1/2);
+        totWidth  = nbHor * (maxWidth+cx1);
+
+        int extraHeight = cy1;
+
+        // only change our width/height if asked for
+        if ( width == -1 )
+        {
+            if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+                width = totWidth + cx1;
+            else
+                width = widthOld;
+        }
+
+        if ( height == -1 )
+        {
+            if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+                height = totHeight + extraHeight;
+            else 
+                height = heightOld;
+        }
+
+        MoveWindow(GetHwnd(), x_offset, y_offset, width, height, TRUE);
+
+        x_offset += cx1;
+        y_offset += cy1;
+    }
+
+    int startX = x_offset;
+    int startY = y_offset;
+
+    for ( i = 0 ; i < m_noItems; i++)
+    {
+        // Bidimensional radio adjustment
+        if (i&&((i%m_majorDim)==0)) // Why is this omitted for i = 0?
+        {
+            if (m_windowStyle & wxRA_VERTICAL)
+            {
+                y_offset = startY;
+                x_offset += maxWidth + cx1;
+            }
+            else
+            {
+                x_offset = startX;
+                y_offset += maxHeight;
+                if (m_radioWidth[0]>0)
+                    y_offset += cy1/2;
+            }
+        }
+        int eachWidth;
+        int eachHeight;
+        if (m_radioWidth[i]<0)
+        {
+            // It's a labeled item
+            buf = wxGetWindowText(m_radioButtons[i]);
+            GetTextExtent(buf, &current_width, &cyf);
+
+            // How do we find out radio button bitmap size!!
+            // By adjusting them carefully, manually :-)
+            eachWidth = (int)(current_width + RADIO_SIZE);
+            eachHeight = (int)((3*cyf)/2);
+        }
+        else
+        {
+            eachWidth = m_radioWidth[i];
+            eachHeight = m_radioHeight[i];
+        }
+
+// TODO:
+/*
+        MoveWindow((HWND)m_radioButtons[i], x_offset, y_offset,
+                   eachWidth, eachHeight,
+                   TRUE);
+*/
+        if (m_windowStyle & wxRA_SPECIFY_ROWS)
+        {
+            y_offset += maxHeight;
+            if (m_radioWidth[0]>0)
+                y_offset += cy1/2;
+        }
+        else
+            x_offset += maxWidth + cx1;
+    }
 }
 
 void wxRadioBox::GetSize(int *width, int *height) const
 {
-    // TODO
-}
+    RECT rect;
+    rect.left = -1; rect.right = -1; rect.top = -1; rect.bottom = -1;
 
-void wxRadioBox::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
+    if (m_hWnd)
+        wxFindMaxSize(m_hWnd, &rect);
 
-wxString wxRadioBox::GetLabel() const
-{
-    // TODO
-    return wxString("");
+    int i;
+    for (i = 0; i < m_noItems; i++)
+        wxFindMaxSize(m_radioButtons[i], &rect);
+
+    *width = rect.right - rect.left;
+    *height = rect.bottom - rect.top;
 }
 
-void wxRadioBox::SetLabel(const wxString& label)
+void wxRadioBox::GetPosition(int *x, int *y) const
 {
-    // TODO
+    wxWindow *parent = GetParent();
+    RECT rect;
+    rect.left = -1; rect.right = -1; rect.top = -1; rect.bottom = -1;
+
+    int i;
+    for (i = 0; i < m_noItems; i++)
+        wxFindMaxSize(m_radioButtons[i], &rect);
+
+    if (m_hWnd)
+        wxFindMaxSize(m_hWnd, &rect);
+
+    // Since we now have the absolute screen coords,
+    // if there's a parent we must subtract its top left corner
+    POINT point;
+    point.x = rect.left;
+    point.y = rect.top;
+// TODO:
+/*
+    if (parent)
+    {
+        ::ScreenToClient((HWND) parent->GetHWND(), &point);
+    }
+*/
+    // We may be faking the client origin.
+    // So a window that's really at (0, 30) may appear
+    // (to wxWin apps) to be at (0, 0).
+    if (GetParent())
+    {
+        wxPoint pt(GetParent()->GetClientAreaOrigin());
+        point.x -= pt.x;
+        point.y -= pt.y;
+    }
+
+    *x = point.x;
+    *y = point.y;
 }
 
 void wxRadioBox::SetFocus()
 {
-    // TODO
+// TODO:
+/*
+    if (m_noItems > 0)
+    {
+        if (m_selectedButton == -1)
+            ::SetFocus((HWND) m_radioButtons[0]);
+        else
+            ::SetFocus((HWND) m_radioButtons[m_selectedButton]);
+    }
+*/
 }
 
 bool wxRadioBox::Show(bool show)
 {
-    // TODO
-    return FALSE;
+    if ( !wxControl::Show(show) )
+        return FALSE;
+
+    int nCmdShow = show ? SW_SHOW : SW_HIDE;
+    for ( int i = 0; i < m_noItems; i++ )
+    {
+// TODO:        ::ShowWindow((HWND)m_radioButtons[i], nCmdShow);
+    }
+
+    return TRUE;
 }
 
 // Enable a specific button
 void wxRadioBox::Enable(int item, bool enable)
 {
-    // TODO
+    wxCHECK_RET( item >= 0 && item < m_noItems,
+                 wxT("invalid item in wxRadioBox::Enable()") );
+
+// TODO: ::EnableWindow((HWND) m_radioButtons[item], enable);
 }
 
 // Enable all controls
-void wxRadioBox::Enable(bool enable)
+bool wxRadioBox::Enable(bool enable)
 {
-    wxControl::Enable(enable);
+    if ( !wxControl::Enable(enable) )
+        return FALSE;
 
-    // TODO
+// TODO:
+/*
+    for (int i = 0; i < m_noItems; i++)
+        ::EnableWindow((HWND) m_radioButtons[i], enable);
+*/
+    return TRUE;
 }
 
 // Show a specific button
 void wxRadioBox::Show(int item, bool show)
 {
-    // TODO
+    wxCHECK_RET( item >= 0 && item < m_noItems,
+                 wxT("invalid item in wxRadioBox::Show()") );
+
+// TODO:    ::ShowWindow((HWND)m_radioButtons[item], show ? SW_SHOW : SW_HIDE);
+}
+
+WXHBRUSH wxRadioBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
+        WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+{
+// TODO:
+/*
+    if (GetParent()->GetTransparentBackground())
+        SetBkMode((HDC) pDC, TRANSPARENT);
+    else
+        SetBkMode((HDC) pDC, OPAQUE);
+
+    ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
+    ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
+*/
+    wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
+
+    return (WXHBRUSH) backgroundBrush->GetResourceHandle();
 }
 
 // For single selection items only
-wxString wxRadioBox::GetStringSelection () const
+wxString wxRadioBox::GetStringSelection() const
 {
-    int sel = GetSelection ();
+    wxString result;
+    int sel = GetSelection();
     if (sel > -1)
-        return this->GetString (sel);
-    else
-        return wxString("");
+        result = GetString(sel);
+
+    return result;
 }
 
-bool wxRadioBox::SetStringSelection (const wxString& s)
+bool wxRadioBox::SetStringSelection(const wxString& s)
 {
     int sel = FindString (s);
     if (sel > -1)
@@ -185,10 +650,124 @@ bool wxRadioBox::SetStringSelection (const wxString& s)
         return FALSE;
 }
 
+bool wxRadioBox::ContainsHWND(WXHWND hWnd) const
+{
+    int i;
+    for (i = 0; i < Number(); i++)
+    {
+        if (GetRadioButtons()[i] == hWnd)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
 void wxRadioBox::Command (wxCommandEvent & event)
 {
     SetSelection (event.m_commandInt);
     ProcessCommand (event);
 }
 
+void wxRadioBox::SubclassRadioButton(WXHWND hWndBtn)
+{
+    HWND hwndBtn = (HWND)hWndBtn;
+
+// TODO:
+/*
+    if ( !s_wndprocRadioBtn )
+        s_wndprocRadioBtn = (WXFARPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC);
+
+    // No GWL_USERDATA in Win16, so omit this subclassing.
+    ::SetWindowLong(hwndBtn, GWL_WNDPROC, (long)wxRadioBtnWndProc);
+    ::SetWindowLong(hwndBtn, GWL_USERDATA, (long)this);
+*/
+}
+
+void wxRadioBox::SendNotificationEvent()
+{
+    wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId);
+    event.SetInt( m_selectedButton );
+    event.SetString( GetString(m_selectedButton) );
+    event.SetEventObject( this );
+    ProcessCommand(event);
+}
+
+// ---------------------------------------------------------------------------
+// window proc for radio buttons
+// ---------------------------------------------------------------------------
+
+MRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd,
+                                           UINT msg,
+                                           MPARAM wParam,
+                                           MPARAM lParam)
+{
+    bool processed = TRUE;
+    if ( msg != WM_KEYDOWN )
+        processed = FALSE;        
+
+    if ( processed )
+    {
+        wxRadioBox *radiobox = (wxRadioBox *)::GetWindowLong(hwnd, GWL_USERDATA);
+
+        wxCHECK_MSG( radiobox, 0, wxT("radio button without radio box?") );
+
+        int sel = radiobox->GetSelection();
+
+// TODO:
+/*
+        switch ( wParam )
+        {
+            case VK_UP:
+                sel--;
+                break;
+
+            case VK_LEFT:
+                sel -= radiobox->GetNumVer();
+                break;
+
+            case VK_DOWN:
+                sel++;
+                break;
+
+            case VK_RIGHT:
+                sel += radiobox->GetNumVer();
+                break;
+
+            case VK_TAB:
+                {
+                    wxNavigationKeyEvent event;
+                    event.SetDirection(!(::GetKeyState(VK_SHIFT) & 0x100));
+                    event.SetWindowChange(FALSE);
+                    event.SetEventObject(radiobox);
+
+                    if ( radiobox->GetEventHandler()->ProcessEvent(event) )
+                        return 0;
+                }
+                // fall through
+
+            default:
+                processed = FALSE;        
+        }
+*/
+        if ( processed )
+        {
+            if ( sel >= 0 && sel < radiobox->Number() )
+            {
+                radiobox->SetSelection(sel);
+
+                // emulate the button click
+                radiobox->SendNotificationEvent();
+            }
+        }
+    }
+
+// TODO:
+/*
+    if ( !processed )
+        return ::CallWindowProc(CASTWNDPROC s_wndprocRadioBtn, hwnd, msg, wParam, lParam);
+    else
+        return 0;
+*/
+    return 0;
+}
 
index 65baab38b6731c39dd876d22546002a693ce1e41..eff8c241ac60901ede64d6fde9ade7f2e0cc0ee8 100644 (file)
@@ -1,26 +1,48 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobut.cpp
 // Purpose:     wxRadioButton
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "radiobut.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
 #endif
 
+#ifndef WX_PRECOMP
+#include <stdio.h>
+#include "wx/setup.h"
 #include "wx/radiobut.h"
+#include "wx/brush.h"
+#endif
+
+#include "wx/msw/private.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl)
 #endif
 
+bool wxRadioButton::OS2Command(WXUINT param, WXWORD id)
+{
+  if (param == BN_CLICKED)
+  {
+    wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId);
+    event.SetEventObject( this );
+    ProcessCommand(event);
+    return TRUE;
+  }
+  else return FALSE;
+}
+
 bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
-                  const wxString& label,
+           const wxString& label,
            const wxPoint& pos,
            const wxSize& size, long style,
            const wxValidator& validator,
@@ -31,15 +53,73 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
 
     if (parent) parent->AddChild(this);
 
+    SetBackgroundColour(parent->GetBackgroundColour());
+    SetForegroundColour(parent->GetForegroundColour());
+
     if ( id == -1 )
-           m_windowId = (int)NewControlId();
+        m_windowId = (int)NewControlId();
     else
-           m_windowId = id;
+        m_windowId = id;
+
+    int x = pos.x;
+    int y = pos.y;
+    int width = size.x;
+    int height = size.y;
 
     m_windowStyle = style ;
 
-    // TODO create radiobutton
-    return FALSE;
+// TODO create radiobutton
+/*
+  long groupStyle = 0;
+  if (m_windowStyle & wxRB_GROUP)
+    groupStyle = WS_GROUP;
+
+//  long msStyle = groupStyle | RADIO_FLAGS;
+  long msStyle = groupStyle | BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE ;
+
+  bool want3D;
+  WXDWORD exStyle = Determine3DEffects(0, &want3D) ;
+
+  m_hWnd = (WXHWND) CreateWindowEx(exStyle, RADIO_CLASS, (const wxChar *)label,
+                          msStyle,0,0,0,0,
+                          (HWND) parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL);
+
+  wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create radiobutton") );
+
+
+  SetFont(parent->GetFont());
+
+  // Subclass again for purposes of dialog editing mode
+  SubclassWin((WXHWND)m_hWnd);
+
+//  SetValue(value);
+*/
+
+  // start GRW fix
+  if (label != wxT(""))
+  {
+    int label_width, label_height;
+    GetTextExtent(label, &label_width, &label_height, NULL, NULL, & this->GetFont());
+    if (width < 0)
+      width = (int)(label_width + RADIO_SIZE);
+    if (height<0)
+    {
+      height = (int)(label_height);
+      if (height < RADIO_SIZE)
+        height = RADIO_SIZE;
+    }
+  }
+  else
+  {
+    if (width < 0)
+      width = RADIO_SIZE;
+    if (height < 0)
+      height = RADIO_SIZE;
+  }
+  // end GRW fix
+
+  SetSize(x, y, width, height);
+  return FALSE;
 }
 
 void wxRadioButton::SetLabel(const wxString& label)
@@ -65,4 +145,69 @@ void wxRadioButton::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
+bool wxBitmapRadioButton::Create(wxWindow *parent, wxWindowID id,
+       const wxBitmap *bitmap,
+           const wxPoint& pos,
+           const wxSize& size, long style,
+           const wxValidator& validator,
+           const wxString& name)
+{
+  SetName(name);
+  SetValidator(validator);
+
+  if (parent) parent->AddChild(this);
+  SetBackgroundColour(parent->GetBackgroundColour());
+  SetForegroundColour(parent->GetForegroundColour());
+
+  if ( id == -1 )
+    m_windowId = (int)NewControlId();
+  else
+  m_windowId = id;
+
+  int x = pos.x;
+  int y = pos.y;
+  int width = size.x;
+  int height = size.y;
+  m_windowStyle = style ;
+
+  long groupStyle = 0;
+  if (m_windowStyle & wxRB_GROUP)
+    groupStyle = WS_GROUP;
+
+// TODO:
+/*
+//  long msStyle = groupStyle | RADIO_FLAGS;
+//  long msStyle = groupStyle | BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE ;
+
+  m_hWnd = (WXHWND) CreateWindowEx(MakeExtendedStyle(m_windowStyle), RADIO_CLASS, "toggle",
+                          msStyle,0,0,0,0,
+                          (HWND) parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL);
+
+  wxCHECK_MSG( m_hWnd, "Failed to create radio button", FALSE );
+
+*/
+  // Subclass again for purposes of dialog editing mode
+  SubclassWin(GetHWND());
+
+  SetSize(x, y, width, height);
+
+  return TRUE;
+}
+
+void wxBitmapRadioButton::SetLabel(const wxBitmap *bitmap)
+{
+}
+
+void wxBitmapRadioButton::SetValue(bool value)
+{
+// Following necessary for Win32s, because Win32s translate BM_SETCHECK
+//  SendMessage((HWND) GetHWND(), BM_SETCHECK, (WPARAM)value, 0L);
+}
+
+// Get single selection, for single choice list items
+bool wxBitmapRadioButton::GetValue(void) const
+{
+//  return (bool)SendMessage((HWND) GetHWND(), BM_GETCHECK, 0, 0L);
+    return FALSE;
+}
 
index 3372ee70282cf69a46bb1fc35bbfaa7ee7d1cb7a..7673bf4463b8eb75b82eea82e4fae25bd5280735 100644 (file)
@@ -1,17 +1,16 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        windows.cpp
 // Purpose:     wxWindow
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/12/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) David Webster
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "window.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
 #ifndef WX_PRECOMP
     #define INCL_DOS
@@ -47,6 +46,8 @@
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
+#include "wx/os2/private.h"
+
 #if wxUSE_TOOLTIPS
     #include "wx/tooltip.h"
 #endif
@@ -118,16 +119,90 @@ END_EVENT_TABLE()
 // implementation
 // ===========================================================================
 
+// Find an item given the MS Windows id
+wxWindow *wxWindow::FindItem(long id) const
+{
+    wxWindowList::Node *current = GetChildren().GetFirst();
+    while (current)
+    {
+        wxWindow *childWin = current->GetData();
+
+        wxWindow *wnd = childWin->FindItem(id);
+        if ( wnd )
+            return wnd;
+
+        if ( childWin->IsKindOf(CLASSINFO(wxControl)) )
+        {
+            wxControl *item = (wxControl *)childWin;
+            if ( item->GetId() == id )
+                return item;
+            else
+            {
+                // In case it's a 'virtual' control (e.g. radiobox)
+                if ( item->GetSubcontrols().Member((wxObject *)id) )
+                    return item;
+            }
+        }
+
+        current = current->GetNext();
+    }
+
+    return NULL;
+}
+
+// Find an item given the MS Windows handle
+wxWindow *wxWindow::FindItemByHWND(WXHWND hWnd, bool controlOnly) const
+{
+    wxWindowList::Node *current = GetChildren().GetFirst();
+    while (current)
+    {
+        wxWindow *parent = current->GetData();
+
+        // Do a recursive search.
+        wxWindow *wnd = parent->FindItemByHWND(hWnd);
+        if ( wnd )
+            return wnd;
+
+        if ( !controlOnly || parent->IsKindOf(CLASSINFO(wxControl)) )
+        {
+            wxWindow *item = current->GetData();
+            if ( item->GetHWND() == hWnd )
+                return item;
+            else
+            {
+                if ( item->ContainsHWND(hWnd) )
+                    return item;
+            }
+        }
+
+        current = current->GetNext();
+    }
+    return NULL;
+}
+
+// Default command handler
+bool wxWindow::OS2Command(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id))
+{
+    return FALSE;
+}
+
+// ----------------------------------------------------------------------------
+// constructors and such
+// ----------------------------------------------------------------------------
+
 void wxWindow::Init()
 {
     // generic
     InitBase();
 
     // PM specific
+    m_doubleClickAllowed = 0;
     m_winCaptured = FALSE;
+
     m_isBeingDeleted = FALSE;
+    m_oldWndProc = 0;
+    m_useCtl3D = FALSE;
     m_mouseInWindow = FALSE;
-    m_backgroundTransparent = FALSE;
 
     // wxWnd
     m_hMenu = 0;
@@ -139,26 +214,16 @@ void wxWindow::Init()
 
     m_xThumbSize = 0;
     m_yThumbSize = 0;
+    m_backgroundTransparent = FALSE;
 
     // as all windows are created with WS_VISIBLE style...
     m_isShown = TRUE;
 
-}
-
-bool wxWindow::Create(wxWindow *parent, wxWindowID id,
-                      const wxPoint& pos,
-                      const wxSize& size,
-                      long style,
-                      const wxString& name)
-{
-    wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") );
-
-    if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
-        return FALSE;
-
-    // TODO: PM Specific initialization
-    parent->AddChild(this);
-    return TRUE;
+#if wxUSE_MOUSEEVENT_HACK
+    m_lastMouseX =
+    m_lastMouseY = -1;
+    m_lastMouseEvent = -1;
+#endif // wxUSE_MOUSEEVENT_HACK
 }
 
 // Destructor
@@ -166,7 +231,7 @@ wxWindow::~wxWindow()
 {
     m_isBeingDeleted = TRUE;
 
-    PMDetachWindowMenu();
+    OS2DetachWindowMenu();
     // delete handlers?
     if (m_parent)
         m_parent->RemoveChild(this);
@@ -180,470 +245,2507 @@ wxWindow::~wxWindow()
     }
 }
 
-// ---------------------------------------------------------------------------
-// basic operations
-// ---------------------------------------------------------------------------
-
-void wxWindow::Raise()
+bool wxWindow::Create(wxWindow *parent, wxWindowID id,
+                      const wxPoint& pos,
+                      const wxSize& size,
+                      long style,
+                      const wxString& name)
 {
-    // TODO:
-}
+    wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") );
 
-void wxWindow::Lower()
-{
-    // TODO:
-}
+    if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
+        return FALSE;
 
-void wxWindow::SetFocus()
-{
-    // TODO:
-}
+    parent->AddChild(this);
 
-void wxWindow::WarpPointer(int x_pos, int y_pos)
-{
-    // TODO:
+    // TODO: PM Specific initialization
+    OS2Create(m_windowId, parent, wxCanvasClassName, this, NULL,
+              pos.x, pos.y,
+              WidthDefault(size.x), HeightDefault(size.y),
+              msflags, NULL, exStyle);
+    return TRUE;
 }
 
-void wxWindow::CaptureMouse()
-{
-    // TODO:
-}
+// ---------------------------------------------------------------------------
+// basic operations
+// ---------------------------------------------------------------------------
 
-void wxWindow::ReleaseMouse()
+void wxWindow::SetFocus()
 {
     // TODO:
 }
 
-void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
+wxWindow* wxWindow::FindFocus()
 {
+    wxWindow*                       window = NULL;
     // TODO:
+    return(window);
 }
 
-void wxWindow::Clear()
+bool wxWindow::Enable(bool enable) // check if base implementation is OK
 {
     // TODO:
+    return(TRUE);
 }
 
-bool wxWindow::SetFont(const wxFont& f)
+bool wxWindow::Show(bool show) // check if base implementation is OK
 {
     // TODO:
     return(TRUE);
 }
 
-int  wxWindow::GetCharHeight() const
+void wxWindow::Raise()
 {
     // TODO:
-    return(1);
 }
 
-int  wxWindow::GetCharWidth() const
+void wxWindow::Lower()
 {
     // TODO:
-    return(1);
 }
 
-void wxWindow::GetTextExtent( const wxString& string
-                             ,int*            x
-                             ,int*            y
-                             ,int*            descent
-                             ,int*            externalLeading
-                             ,const wxFont*   theFont
-                            ) const
+void wxWindow::SetTitle( const wxString& title)
 {
-    // TODO:
+    SetWindowText(GetHwnd(), title.c_str());
 }
 
-void wxWindow::SetScrollbar( int  orient
-                            ,int  pos
-                            ,int  thumbVisible
-                            ,int  range
-                            ,bool refresh
-                           )
+wxString wxWindow::GetTitle() const
 {
-    // TODO:
+    return wxGetWindowText(GetHWND());
 }
 
-void wxWindow::SetScrollPos( int  orient
-                            ,int  pos
-                            ,bool refresh
-                           )
+void wxWindow::CaptureMouse()
 {
     // TODO:
 }
 
-int  wxWindow::GetScrollPos(int orient) const
+void wxWindow::ReleaseMouse()
 {
     // TODO:
-    return(1);
 }
 
-int  wxWindow::GetScrollRange(int orient) const
+bool wxWindow::SetFont(const wxFont& f)
 {
     // TODO:
-    return(1);
+    return(TRUE);
 }
 
-int  wxWindow::GetScrollThumb(int orient) const
+bool wxWindow::SetCursor(const wxCursor& cursor) // check if base implementation is OK
 {
     // TODO:
-    return(1);
+    return(TRUE);
 }
 
-void wxWindow::ScrollWindow( int           dx
-                            ,int           dy
-                            ,const wxRect* rect
-                           )
+void wxWindow::WarpPointer(int x_pos, int y_pos)
 {
     // TODO:
 }
 
-#if wxUSE_DRAG_AND_DROP
-void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
+#if WXWIN_COMPATIBILITY
+void wxWindow::OS2DeviceToLogical (float *x, float *y) const
 {
-    // TODO:
 }
-#endif
+#endif // WXWIN_COMPATIBILITY
 
-void wxWindow::DoClientToScreen( int *x, int *y ) const
-{
-    // TODO:
-}
+// ---------------------------------------------------------------------------
+// scrolling stuff
+// ---------------------------------------------------------------------------
 
-void wxWindow::DoScreenToClient( int *x, int *y ) const
+#if WXWIN_COMPATIBILITY
+void wxWindow::SetScrollRange(int orient, int range, bool refresh)
 {
-    // TODO:
+   // TODO:
 }
 
-void wxWindow::DoGetPosition( int *x, int *y ) const
+void wxWindow::SetScrollPage(int orient, int page, bool refresh)
 {
-    // TODO:
+   // TODO:
 }
 
-void wxWindow::DoGetSize( int *width, int *height ) const
+int wxWindow::OldGetScrollRange(int orient) const
 {
-    // TODO:
+   // TODO:
+   return 0;
 }
 
-void wxWindow::DoGetClientSize( int *width, int *height ) const
+int  wxWindow::GetScrollPage(int orient) const
 {
     // TODO:
+    return(1);
 }
 
-void wxWindow::DoSetSize(int x, int y,
-                         int width, int height,
-                         int sizeFlags)
+int  wxWindow::GetScrollPos(int orient) const
 {
     // TODO:
+    return(1);
 }
 
-void wxWindow::DoSetClientSize(int width, int height)
+int  wxWindow::GetScrollRange(int orient) const
 {
     // TODO:
+    return(1);
 }
 
-bool wxWindow::DoPopupMenu( wxMenu *menu, int x, int y )
+int  wxWindow::GetScrollThumb(int orient) const
 {
     // TODO:
-    return(TRUE);
+    return(1);
 }
 
-void wxWindow::Fit()
+void wxWindow::SetScrollPos( int  orient
+                            ,int  pos
+                            ,bool refresh
+                           )
 {
     // TODO:
 }
 
-bool wxWindow::Show(bool show) // check if base implementation is OK
+void wxWindow::SetScrollbar( int  orient
+                            ,int  pos
+                            ,int  thumbVisible
+                            ,int  range
+                            ,bool refresh
+                           )
 {
     // TODO:
-    return(TRUE);
 }
 
-bool wxWindow::Enable(bool enable) // check if base implementation is OK
+void wxWindow::ScrollWindow( int           dx
+                            ,int           dy
+                            ,const wxRect* rect
+                           )
 {
     // TODO:
-    return(TRUE);
 }
 
-bool wxWindow::SetCursor(const wxCursor& cursor) // check if base implementation is OK
-{
-    // TODO:
-    return(TRUE);
-}
+// ---------------------------------------------------------------------------
+// subclassing
+// ---------------------------------------------------------------------------
 
-bool wxWindow::Validate()
+void wxWindow::SubclassWin(WXHWND hWnd)
 {
-    // TODO:
-    return(TRUE);
-}
+    wxASSERT_MSG( !m_oldWndProc, wxT("subclassing window twice?") );
 
-wxWindow* wxWindow::FindFocus()
-{
-    wxWindow*                       window = NULL;
-    // TODO:
-    return(window);
+    HWND hwnd = (HWND)hWnd;
+/*
+* TODO: implement something like this:
+*   wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in SubclassWin") );
+*
+*   wxAssociateWinWithHandle(hwnd, this);
+*
+*   m_oldWndProc = (WXFARPROC) GetWindowLong(hwnd, GWL_WNDPROC);
+*   SetWindowLong(hwnd, GWL_WNDPROC, (LONG) wxWndProc);
+*/
 }
 
-void wxWindow::DragAcceptFiles(bool accept)
+void wxWindow::UnsubclassWin()
 {
-    // TODO:
-}
+/*
+* TODO:
 
-#if wxUSE_CARET && WXWIN_COMPATIBILITY
-void wxWindow::CreateCaret(int w, int h)
-{
-    // TODO:
-}
+    wxRemoveHandleAssociation(this);
 
-void wxWindow::CreateCaret(const wxBitmap *bitmap)
-{
-    // TODO:
-}
+    // Restore old Window proc
+    HWND hwnd = GetHwnd();
+    if ( hwnd )
+    {
+        m_hWnd = 0;
 
-void wxWindow::DestroyCaret()
-{
-    // TODO:
-}
+        wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in UnsubclassWin") );
 
-void wxWindow::ShowCaret(bool show)
-{
-    // TODO:
+        FARPROC farProc = (FARPROC) GetWindowLong(hwnd, GWL_WNDPROC);
+        if ( (m_oldWndProc != 0) && (farProc != (FARPROC) m_oldWndProc) )
+        {
+            SetWindowLong(hwnd, GWL_WNDPROC, (LONG) m_oldWndProc);
+            m_oldWndProc = 0;
+        }
+    }
+*/
 }
 
-void wxWindow::SetCaretPos(int x, int y)
+// Make a Windows extended style from the given wxWindows window style
+WXDWORD wxWindow::MakeExtendedStyle(long style, bool eliminateBorders)
 {
-    // TODO:
-}
+   // TODO:
+    WXDWORD exStyle = 0;
+/*
+    if ( style & wxTRANSPARENT_WINDOW )
+        exStyle |= WS_EX_TRANSPARENT;
 
-void wxWindow::GetCaretPos(int *x, int *y) const
+    if ( !eliminateBorders )
+    {
+        if ( style & wxSUNKEN_BORDER )
+            exStyle |= WS_EX_CLIENTEDGE;
+        if ( style & wxDOUBLE_BORDER )
+            exStyle |= WS_EX_DLGMODALFRAME;
+        if ( style & wxRAISED_BORDER )
+            exStyle |= WS_EX_WINDOWEDGE;
+        if ( style & wxSTATIC_BORDER )
+            exStyle |= WS_EX_STATICEDGE;
+    }
+*/
+    return exStyle;
+}
+
+// Determines whether native 3D effects or CTL3D should be used,
+// applying a default border style if required, and returning an extended
+// style to pass to CreateWindowEx.
+WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle,
+                                     bool *want3D) const
+{
+   DWORD exStyle; // remove after implementation doe
+/* TODO:  this ought to be fun
+*
+    // If matches certain criteria, then assume no 3D effects
+    // unless specifically requested (dealt with in MakeExtendedStyle)
+    if ( !GetParent() || !IsKindOf(CLASSINFO(wxControl)) || (m_windowStyle & wxNO_BORDER) )
+    {
+        *want3D = FALSE;
+        return MakeExtendedStyle(m_windowStyle, FALSE);
+    }
+
+    // Determine whether we should be using 3D effects or not.
+    bool nativeBorder = FALSE; // by default, we don't want a Win95 effect
+
+    // 1) App can specify global 3D effects
+    *want3D = wxTheApp->GetAuto3D();
+
+    // 2) If the parent is being drawn with user colours, or simple border specified,
+    // switch effects off. TODO: replace wxUSER_COLOURS with wxNO_3D
+    if ( GetParent() && (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) || (m_windowStyle & wxSIMPLE_BORDER) )
+        *want3D = FALSE;
+
+    // 3) Control can override this global setting by defining
+    // a border style, e.g. wxSUNKEN_BORDER
+    if ( m_windowStyle & wxSUNKEN_BORDER  )
+        *want3D = TRUE;
+
+    // 4) If it's a special border, CTL3D can't cope so we want a native border
+    if ( (m_windowStyle & wxDOUBLE_BORDER) || (m_windowStyle & wxRAISED_BORDER) ||
+        (m_windowStyle & wxSTATIC_BORDER) )
+    {
+        *want3D = TRUE;
+        nativeBorder = TRUE;
+    }
+
+    // 5) If this isn't a Win95 app, and we are using CTL3D, remove border
+    // effects from extended style
+#if wxUSE_CTL3D
+    if ( *want3D )
+        nativeBorder = FALSE;
+#endif
+
+    DWORD exStyle = MakeExtendedStyle(m_windowStyle, !nativeBorder);
+
+    // If we want 3D, but haven't specified a border here,
+    // apply the default border style specified.
+    // TODO what about non-Win95 WIN32? Does it have borders?
+#if defined(__WIN95__) && !wxUSE_CTL3D
+    if ( defaultBorderStyle && (*want3D) && ! ((m_windowStyle & wxDOUBLE_BORDER) || (m_windowStyle & wxRAISED_BORDER ) ||
+        (m_windowStyle & wxSTATIC_BORDER) || (m_windowStyle & wxSIMPLE_BORDER) ))
+        exStyle |= defaultBorderStyle; // WS_EX_CLIENTEDGE;
+#endif
+*/
+    return exStyle;
+}
+
+#if WXWIN_COMPATIBILITY
+void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
+{
+    // TODO:
+}
+
+wxObject* wxWindow::GetChild(int number) const
+{
+    // TODO:
+    return((wxObject*)this);
+}
+
+void wxWindow::OnDefaultAction(wxControl *initiatingItem)
+{
+    // TODO:
+}
+
+#endif // WXWIN_COMPATIBILITY
+
+// Setup background and foreground colours correctly
+void wxWindow::SetupColours()
+{
+    if ( GetParent() )
+        SetBackgroundColour(GetParent()->GetBackgroundColour());
+}
+
+void wxWindow::OnIdle(wxIdleEvent& event)
+{
+    // TODO:
+}
+
+// Set this window to be the child of 'parent'.
+bool wxWindow::Reparent(wxWindow *parent)
+{
+    if ( !wxWindowBase::Reparent(parent) )
+        return FALSE;
+   // TODO:
+    return FALSE;
+}
+
+void wxWindow::Clear()
+{
+    // TODO:
+}
+
+void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
+{
+    // TODO:
+}
+
+// ---------------------------------------------------------------------------
+// drag and drop
+// ---------------------------------------------------------------------------
+
+#if wxUSE_DRAG_AND_DROP
+void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
+{
+    // TODO:
+}
+#endif
+
+// old style file-manager drag&drop support: we retain the old-style
+// DragAcceptFiles in parallel with SetDropTarget.
+void wxWindow::DragAcceptFiles(bool accept)
+{
+    // TODO:
+}
+
+// ----------------------------------------------------------------------------
+// tooltips
+// ----------------------------------------------------------------------------
+
+#if wxUSE_TOOLTIPS
+
+void wxWindow::DoSetToolTip(wxToolTip *tooltip)
+{
+    wxWindowBase::DoSetToolTip(tooltip);
+
+    if ( m_tooltip )
+        m_tooltip->SetWindow(this);
+}
+
+#endif // wxUSE_TOOLTIPS
+
+// ---------------------------------------------------------------------------
+// moving and resizing
+// ---------------------------------------------------------------------------
+
+// Get total size
+void wxWindow::DoGetSize( int *width, int *height ) const
+{
+    // TODO:
+}
+
+void wxWindow::DoGetPosition( int *x, int *y ) const
+{
+    // TODO:
+}
+
+void wxWindow::DoScreenToClient( int *x, int *y ) const
+{
+    // TODO:
+}
+
+void wxWindow::DoClientToScreen( int *x, int *y ) const
+{
+    // TODO:
+}
+
+// Get size *available for subwindows* i.e. excluding menu bar etc.
+void wxWindow::DoGetClientSize( int *width, int *height ) const
+{
+    // TODO:
+}
+
+void wxWindow::DoMoveWindow(int x, int y, int width, int height)
+{
+   // TODO:
+}
+
+// set the size of the window: if the dimensions are positive, just use them,
+// but if any of them is equal to -1, it means that we must find the value for
+// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
+// which case -1 is a valid value for x and y)
+//
+// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
+// the width/height to best suit our contents, otherwise we reuse the current
+// width/height
+void wxWindow::DoSetSize(int x, int y,
+                         int width, int height,
+                         int sizeFlags)
+{
+    // TODO:
+}
+
+// for a generic window there is no natural best size - just use the current one
+wxSize wxWindow::DoGetBestSize()
+{
+    return GetSize();
+}
+
+void wxWindow::DoSetClientSize(int width, int height)
+{
+    // TODO:
+}
+
+wxPoint wxWindow::GetClientAreaOrigin() const
+{
+    return wxPoint(0, 0);
+}
+
+void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
+{
+    // TODO:
+}
+
+// ---------------------------------------------------------------------------
+// text metrics
+// ---------------------------------------------------------------------------
+
+int  wxWindow::GetCharHeight() const
+{
+    // TODO:
+    return(1);
+}
+
+int  wxWindow::GetCharWidth() const
+{
+    // TODO:
+    return(1);
+}
+
+void wxWindow::GetTextExtent( const wxString& string
+                             ,int*            x
+                             ,int*            y
+                             ,int*            descent
+                             ,int*            externalLeading
+                             ,const wxFont*   theFont
+                            ) const
+{
+    // TODO:
+}
+
+#if wxUSE_CARET && WXWIN_COMPATIBILITY
+// ---------------------------------------------------------------------------
+// Caret manipulation
+// ---------------------------------------------------------------------------
+
+void wxWindow::CreateCaret(int w, int h)
+{
+    // TODO:
+}
+
+void wxWindow::CreateCaret(const wxBitmap *bitmap)
+{
+    // TODO:
+}
+
+void wxWindow::ShowCaret(bool show)
+{
+    // TODO:
+}
+
+void wxWindow::DestroyCaret()
+{
+    // TODO:
+}
+
+void wxWindow::SetCaretPos(int x, int y)
+{
+    // TODO:
+}
+
+void wxWindow::GetCaretPos(int *x, int *y) const
+{
+    // TODO:
+}
+
+#endif //wxUSE_CARET
+
+// ---------------------------------------------------------------------------
+// popup menu
+// ---------------------------------------------------------------------------
+
+bool wxWindow::DoPopupMenu( wxMenu *menu, int x, int y )
+{
+    // TODO:
+    return(TRUE);
+}
+
+// ===========================================================================
+// pre/post message processing
+// ===========================================================================
+
+MRESULT wxWindow::OS2DefWindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+   // TODO:
+   return (MRESULT)0;
+}
+
+bool wxWindow::OS2ProcessMessage(WXMSG* pMsg)
+{
+   // TODO:
+    return FALSE;
+}
+
+bool wxWindow::OS2TranslateMessage(WXMSG* pMsg)
+{
+    return m_acceleratorTable.Translate(this, pMsg);
+}
+
+// ---------------------------------------------------------------------------
+// message params unpackers (different for Win16 and Win32)
+// ---------------------------------------------------------------------------
+
+void wxWindow::UnpackCommand(WXWPARAM wParam, WXLPARAM lParam,
+                             WORD *id, WXHWND *hwnd, WORD *cmd)
+{
+    *id = LOWORD(wParam);
+    *hwnd = (WXHWND)lParam;
+    *cmd = HIWORD(wParam);
+}
+
+void wxWindow::UnpackActivate(WXWPARAM wParam, WXLPARAM lParam,
+                              WXWORD *state, WXWORD *minimized, WXHWND *hwnd)
+{
+    *state = LOWORD(wParam);
+    *minimized = HIWORD(wParam);
+    *hwnd = (WXHWND)lParam;
+}
+
+void wxWindow::UnpackScroll(WXWPARAM wParam, WXLPARAM lParam,
+                            WXWORD *code, WXWORD *pos, WXHWND *hwnd)
+{
+    *code = LOWORD(wParam);
+    *pos = HIWORD(wParam);
+    *hwnd = (WXHWND)lParam;
+}
+
+void wxWindow::UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam,
+                              WXWORD *nCtlColor, WXHDC *hdc, WXHWND *hwnd)
+{
+    *nCtlColor = CTLCOLOR_BTN;
+    *hwnd = (WXHWND)lParam;
+    *hdc = (WXHDC)wParam;
+}
+
+void wxWindow::UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam,
+                                WXWORD *item, WXWORD *flags, WXHMENU *hmenu)
+{
+    *item = (WXWORD)wParam;
+    *flags = HIWORD(wParam);
+    *hmenu = (WXHMENU)lParam;
+}
+
+// ---------------------------------------------------------------------------
+// Main wxWindows window proc and the window proc for wxWindow
+// ---------------------------------------------------------------------------
+
+// Hook for new window just as it's being created, when the window isn't yet
+// associated with the handle
+wxWindow *wxWndHook = NULL;
+
+// Main window proc
+MRESULT wxWndProc(HWND hWnd, UINT message, MPARAM wParam, MPARAM lParam)
+{
+    // trace all messages - useful for the debugging
+#ifdef __WXDEBUG__
+    wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"),
+               wxGetMessageName(message), wParam, lParam);
+#endif // __WXDEBUG__
+
+    wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd);
+
+    // when we get the first message for the HWND we just created, we associate
+    // it with wxWindow stored in wxWndHook
+    if ( !wnd && wxWndHook )
+    {
+#if 0 // def __WXDEBUG__
+        char buf[512];
+        ::GetClassNameA((HWND) hWnd, buf, 512);
+        wxString className(buf);
+#endif
+
+        wxAssociateWinWithHandle(hWnd, wxWndHook);
+        wnd = wxWndHook;
+        wxWndHook = NULL;
+        wnd->SetHWND((WXHWND)hWnd);
+    }
+
+    MRESULT rc;
+
+    // Stop right here if we don't have a valid handle in our wxWindow object.
+    if ( wnd && !wnd->GetHWND() )
+    {
+        // FIXME: why do we do this?
+        wnd->SetHWND((WXHWND) hWnd);
+        rc = wnd->OS2DefWindowProc(message, wParam, lParam );
+        wnd->SetHWND(0);
+    }
+    else
+    {
+        if ( wnd )
+            rc = wnd->OS2WindowProc(hWnd, message, wParam, lParam);
+        else
+            rc = DefWindowProc( hWnd, message, wParam, lParam );
+    }
+
+    return rc;
+}
+
+MRESULT wxWindow::OS2WindowProc(HWND hWnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+{
+    // did we process the message?
+    bool processed = FALSE;
+
+    // the return value
+    union
+    {
+        bool        allow;
+        long        result;
+        WXHICON     hIcon;
+        WXHBRUSH    hBrush;
+    } rc;
+
+    // for most messages we should return 0 when we do process the message
+    rc.result = 0;
+    // TODO:
+/*
+    switch ( message )
+    {
+        case WM_CREATE:
+            {
+                bool mayCreate;
+                processed = HandleCreate((WXLPCREATESTRUCT)lParam, &mayCreate);
+                if ( processed )
+                {
+                    // return 0 to allow window creation
+                    rc.result = mayCreate ? 0 : -1;
+                }
+            }
+            break;
+
+        case WM_DESTROY:
+            processed = HandleDestroy();
+            break;
+
+        case WM_MOVE:
+            processed = HandleMove(LOWORD(lParam), HIWORD(lParam));
+            break;
+
+        case WM_SIZE:
+            processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam);
+            break;
+
+        case WM_ACTIVATE:
+            {
+                WXWORD state, minimized;
+                WXHWND hwnd;
+                UnpackActivate(wParam, lParam, &state, &minimized, &hwnd);
+
+                processed = HandleActivate(state, minimized != 0, (WXHWND)hwnd);
+            }
+            break;
+
+        case WM_SETFOCUS:
+            processed = HandleSetFocus((WXHWND)(HWND)wParam);
+            break;
+
+        case WM_KILLFOCUS:
+            processed = HandleKillFocus((WXHWND)(HWND)wParam);
+            break;
+
+        case WM_PAINT:
+            processed = HandlePaint();
+            break;
+
+        case WM_CLOSE:
+            // don't let the DefWindowProc() destroy our window - we'll do it
+            // ourselves in ~wxWindow
+            processed = TRUE;
+            rc.result = TRUE;
+            break;
+
+        case WM_SHOWWINDOW:
+            processed = HandleShow(wParam != 0, (int)lParam);
+            break;
+
+        case WM_MOUSEMOVE:
+        case WM_LBUTTONDOWN:
+        case WM_LBUTTONUP:
+        case WM_LBUTTONDBLCLK:
+        case WM_RBUTTONDOWN:
+        case WM_RBUTTONUP:
+        case WM_RBUTTONDBLCLK:
+        case WM_MBUTTONDOWN:
+        case WM_MBUTTONUP:
+        case WM_MBUTTONDBLCLK:
+            {
+                short x = LOWORD(lParam);
+                short y = HIWORD(lParam);
+
+                processed = HandleMouseEvent(message, x, y, wParam);
+            }
+            break;
+
+        case MM_JOY1MOVE:
+        case MM_JOY2MOVE:
+        case MM_JOY1ZMOVE:
+        case MM_JOY2ZMOVE:
+        case MM_JOY1BUTTONDOWN:
+        case MM_JOY2BUTTONDOWN:
+        case MM_JOY1BUTTONUP:
+        case MM_JOY2BUTTONUP:
+            {
+                int x = LOWORD(lParam);
+                int y = HIWORD(lParam);
+
+                processed = HandleJoystickEvent(message, x, y, wParam);
+            }
+            break;
+
+        case WM_SYSCOMMAND:
+            processed = HandleSysCommand(wParam, lParam);
+            break;
+
+        case WM_COMMAND:
+            {
+                WORD id, cmd;
+                WXHWND hwnd;
+                UnpackCommand(wParam, lParam, &id, &hwnd, &cmd);
+
+                processed = HandleCommand(id, cmd, hwnd);
+            }
+            break;
+
+#ifdef __WIN95__
+        case WM_NOTIFY:
+            processed = HandleNotify((int)wParam, lParam, &rc.result);
+            break;
+#endif  // Win95
+
+            // for these messages we must return TRUE if process the message
+        case WM_DRAWITEM:
+        case WM_MEASUREITEM:
+            {
+                int idCtrl = (UINT)wParam;
+                if ( message == WM_DRAWITEM )
+                {
+                    processed = MSWOnDrawItem(idCtrl,
+                                              (WXDRAWITEMSTRUCT *)lParam);
+                }
+                else
+                {
+                    processed = MSWOnMeasureItem(idCtrl,
+                                                 (WXMEASUREITEMSTRUCT *)lParam);
+                }
+
+                if ( processed )
+                    rc.result = TRUE;
+            }
+            break;
+
+        case WM_GETDLGCODE:
+            if ( m_lDlgCode )
+            {
+                rc.result = m_lDlgCode;
+                processed = TRUE;
+            }
+            //else: get the dlg code from the DefWindowProc()
+            break;
+
+        case WM_KEYDOWN:
+            // If this has been processed by an event handler,
+            // return 0 now (we've handled it).
+            if ( HandleKeyDown((WORD) wParam, lParam) )
+            {
+                processed = TRUE;
+
+                break;
+            }
+
+            // we consider these message "not interesting" to OnChar
+            if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
+            {
+                processed = TRUE;
+
+                break;
+            }
+
+            switch ( wParam )
+            {
+                // avoid duplicate messages to OnChar for these ASCII keys: they
+                // will be translated by TranslateMessage() and received in WM_CHAR
+                case VK_ESCAPE:
+                case VK_SPACE:
+                case VK_RETURN:
+                case VK_BACK:
+                case VK_TAB:
+                    // but set processed to FALSE, not TRUE to still pass them to
+                    // the control's default window proc - otherwise built-in
+                    // keyboard handling won't work
+                    processed = FALSE;
+
+                    break;
+
+#ifdef VK_APPS
+                // special case of VK_APPS: treat it the same as right mouse
+                // click because both usually pop up a context menu
+                case VK_APPS:
+                    {
+                        // construct the key mask
+                        WPARAM fwKeys = MK_RBUTTON;
+                        if ( (::GetKeyState(VK_CONTROL) & 0x100) != 0 )
+                            fwKeys |= MK_CONTROL;
+                        if ( (::GetKeyState(VK_SHIFT) & 0x100) != 0 )
+                            fwKeys |= MK_SHIFT;
+
+                        // simulate right mouse button click
+                        DWORD dwPos = ::GetMessagePos();
+                        int x = GET_X_LPARAM(dwPos),
+                            y = GET_Y_LPARAM(dwPos);
+
+                        ScreenToClient(&x, &y);
+                        processed = HandleMouseEvent(WM_RBUTTONDOWN, x, y, fwKeys);
+                    }
+                    break;
+#endif // VK_APPS
+
+                case VK_LEFT:
+                case VK_RIGHT:
+                case VK_DOWN:
+                case VK_UP:
+                default:
+                    processed = HandleChar((WORD)wParam, lParam);
+            }
+            break;
+
+        case WM_KEYUP:
+            processed = HandleKeyUp((WORD) wParam, lParam);
+            break;
+
+        case WM_CHAR: // Always an ASCII character
+            processed = HandleChar((WORD)wParam, lParam, TRUE);
+            break;
+
+        case WM_HSCROLL:
+        case WM_VSCROLL:
+            {
+                WXWORD code, pos;
+                WXHWND hwnd;
+                UnpackScroll(wParam, lParam, &code, &pos, &hwnd);
+
+                processed = MSWOnScroll(message == WM_HSCROLL ? wxHORIZONTAL
+                                                              : wxVERTICAL,
+                                        code, pos, hwnd);
+            }
+            break;
+
+        // CTLCOLOR messages are sent by children to query the parent for their
+        // colors
+#ifdef __WIN32__
+        case WM_CTLCOLORMSGBOX:
+        case WM_CTLCOLOREDIT:
+        case WM_CTLCOLORLISTBOX:
+        case WM_CTLCOLORBTN:
+        case WM_CTLCOLORDLG:
+        case WM_CTLCOLORSCROLLBAR:
+        case WM_CTLCOLORSTATIC:
+#else // Win16
+        case WM_CTLCOLOR:
+#endif // Win32/16
+            {
+                WXWORD nCtlColor;
+                WXHDC hdc;
+                WXHWND hwnd;
+                UnpackCtlColor(wParam, lParam, &nCtlColor, &hdc, &hwnd);
+
+                processed = HandleCtlColor(&rc.hBrush,
+                                           (WXHDC)hdc,
+                                           (WXHWND)hwnd,
+                                           nCtlColor,
+                                           message,
+                                           wParam,
+                                           lParam);
+            }
+            break;
+
+            // the return value for this message is ignored
+        case WM_SYSCOLORCHANGE:
+            processed = HandleSysColorChange();
+            break;
+
+        case WM_PALETTECHANGED:
+            processed = HandlePaletteChanged((WXHWND) (HWND) wParam);
+            break;
+
+        case WM_QUERYNEWPALETTE:
+            processed = HandleQueryNewPalette();
+            break;
+
+        case WM_ERASEBKGND:
+            processed = HandleEraseBkgnd((WXHDC)(HDC)wParam);
+            if ( processed )
+            {
+                // we processed the message, i.e. erased the background
+                rc.result = TRUE;
+            }
+            break;
+
+        case WM_DROPFILES:
+            processed = HandleDropFiles(wParam);
+            break;
+
+        case WM_INITDIALOG:
+            processed = HandleInitDialog((WXHWND)(HWND)wParam);
+
+            if ( processed )
+            {
+                // we never set focus from here
+                rc.result = FALSE;
+            }
+            break;
+
+        case WM_QUERYENDSESSION:
+            processed = HandleQueryEndSession(lParam, &rc.allow);
+            break;
+
+        case WM_ENDSESSION:
+            processed = HandleEndSession(wParam != 0, lParam);
+            break;
+
+        case WM_GETMINMAXINFO:
+            processed = HandleGetMinMaxInfo((MINMAXINFO*)lParam);
+            break;
+
+        case WM_SETCURSOR:
+            processed = HandleSetCursor((WXHWND)(HWND)wParam,
+                                        LOWORD(lParam),     // hit test
+                                        HIWORD(lParam));    // mouse msg
+
+            if ( processed )
+            {
+                // returning TRUE stops the DefWindowProc() from further
+                // processing this message - exactly what we need because we've
+                // just set the cursor.
+                rc.result = TRUE;
+            }
+            break;
+    }
+
+    if ( !processed )
+    {
+#ifdef __WXDEBUG__
+        wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."),
+                   wxGetMessageName(message));
+#endif // __WXDEBUG__
+        rc.result = MSWDefWindowProc(message, wParam, lParam);
+    }
+*/
+    return rc.result;
+}
+
+// Dialog window proc
+MRESULT wxDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+   // TODO:
+/*
+    if ( message == WM_INITDIALOG )
+    {
+        // for this message, returning TRUE tells system to set focus to the
+        // first control in the dialog box
+        return TRUE;
+    }
+    else
+    {
+        // for all the other ones, FALSE means that we didn't process the
+        // message
+        return 0;
+    }
+*/
+    return (MRESULT)0;
+}
+
+wxList *wxWinHandleList = NULL;
+wxWindow *wxFindWinFromHandle(WXHWND hWnd)
+{
+    wxNode *node = wxWinHandleList->Find((long)hWnd);
+    if ( !node )
+        return NULL;
+    return (wxWindow *)node->Data();
+}
+
+void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win)
+{
+    // adding NULL hWnd is (first) surely a result of an error and
+    // (secondly) breaks menu command processing
+    wxCHECK_RET( hWnd != (HWND)NULL,
+                 wxT("attempt to add a NULL hWnd to window list ignored") );
+
+
+    wxWindow *oldWin = wxFindWinFromHandle((WXHWND) hWnd);
+    if ( oldWin && (oldWin != win) )
+    {
+        wxString str(win->GetClassInfo()->GetClassName());
+        wxLogError("Bug! Found existing HWND %X for new window of class %s", (int) hWnd, (const char*) str);
+    }
+    else if (!oldWin)
+    {
+        wxWinHandleList->Append((long)hWnd, win);
+    }
+}
+
+void wxRemoveHandleAssociation(wxWindow *win)
+{
+    wxWinHandleList->DeleteObject(win);
+}
+
+// Default destroyer - override if you destroy it in some other way
+// (e.g. with MDI child windows)
+void wxWindow::OS2DestroyWindow()
+{
+}
+
+void wxWindow::OS2DetachWindowMenu()
+{
+    if ( m_hMenu )
+    {
+        HMENU hMenu = (HMENU)m_hMenu;
+
+        int N = (int)WinSendMsg(hMenu, MM_QUERYITEMCOUNT, 0, 0);
+        int i;
+        for (i = 0; i < N; i++)
+        {
+            wxChar buf[100];
+            int chars = (int)WinSendMsg(hMenu, MM_QUERYITEMTEXT, MPFROM2SHORT(i, N), buf);
+            if ( !chars )
+            {
+                wxLogLastError(wxT("GetMenuString"));
+
+                continue;
+            }
+
+            if ( wxStrcmp(buf, wxT("&Window")) == 0 )
+            {
+                WinSendMsg(hMenu, MM_DELETEITEM, MPFROM2SHORT(i, TRUE), 0);
+                break;
+            }
+        }
+    }
+}
+
+bool wxWindow::OS2Create(int id,
+                         wxWindow *parent,
+                         const wxChar *wclass,
+                         wxWindow *wx_win,
+                         const wxChar *title,
+                         int x,
+                         int y,
+                         int width,
+                         int height,
+                         WXDWORD style,
+                         const wxChar *dialog_template,
+                         WXDWORD extendedStyle)
+{
+   // TODO:
+/*
+    int x1 = CW_USEDEFAULT;
+    int y1 = 0;
+    int width1 = CW_USEDEFAULT;
+    int height1 = 100;
+
+    // Find parent's size, if it exists, to set up a possible default
+    // panel size the size of the parent window
+    RECT parent_rect;
+    if ( parent )
+    {
+        ::GetClientRect((HWND) parent->GetHWND(), &parent_rect);
+
+        width1 = parent_rect.right - parent_rect.left;
+        height1 = parent_rect.bottom - parent_rect.top;
+    }
+
+    if ( x > -1 ) x1 = x;
+    if ( y > -1 ) y1 = y;
+    if ( width > -1 ) width1 = width;
+    if ( height > -1 ) height1 = height;
+
+    HWND hParent = (HWND)NULL;
+    if ( parent )
+        hParent = (HWND) parent->GetHWND();
+
+    wxWndHook = this;
+
+    if ( dialog_template )
+    {
+        m_hWnd = (WXHWND)::CreateDialog(wxGetInstance(),
+                                        dialog_template,
+                                        hParent,
+                                        (DLGPROC)wxDlgProc);
+
+        if ( m_hWnd == 0 )
+        {
+            wxLogError(_("Can't find dummy dialog template!\n"
+                         "Check resource include path for finding wx.rc."));
+
+            return FALSE;
+        }
+
+        // ::SetWindowLong(GWL_EXSTYLE) doesn't work for the dialogs, so try
+        // to take care of (at least some) extended style flags ourselves
+        if ( extendedStyle & WS_EX_TOPMOST )
+        {
+            if ( !::SetWindowPos(GetHwnd(), HWND_TOPMOST, 0, 0, 0, 0,
+                                 SWP_NOSIZE | SWP_NOMOVE) )
+            {
+                wxLogLastError(wxT("SetWindowPos"));
+            }
+        }
+
+        // move the dialog to its initial position without forcing repainting
+        if ( !::MoveWindow(GetHwnd(), x1, y1, width1, height1, FALSE) )
+        {
+            wxLogLastError(wxT("MoveWindow"));
+        }
+    }
+    else
+    {
+        int controlId = 0;
+        if ( style & WS_CHILD )
+            controlId = id;
+
+        wxString className(wclass);
+        if ( GetWindowStyleFlag() & wxNO_FULL_REPAINT_ON_RESIZE )
+        {
+            className += wxT("NR");
+        }
+
+        m_hWnd = (WXHWND)CreateWindowEx(extendedStyle,
+                                        className,
+                                        title ? title : wxT(""),
+                                        style,
+                                        x1, y1,
+                                        width1, height1,
+                                        hParent, (HMENU)controlId,
+                                        wxGetInstance(),
+                                        NULL);
+
+        if ( !m_hWnd )
+        {
+            wxLogError(_("Can't create window of class %s!\n"
+                         "Possible Windows 3.x compatibility problem?"),
+                       wclass);
+
+            return FALSE;
+        }
+    }
+
+    wxWndHook = NULL;
+#ifdef __WXDEBUG__
+    wxNode* node = wxWinHandleList->Member(this);
+    if (node)
+    {
+        HWND hWnd = (HWND) node->GetKeyInteger();
+        if (hWnd != (HWND) m_hWnd)
+        {
+            wxLogError("A second HWND association is being added for the same window!");
+        }
+    }
+#endif
+*/
+    wxAssociateWinWithHandle((HWND) m_hWnd, this);
+
+    return TRUE;
+}
+
+// ===========================================================================
+// OS2 PM message handlers
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// WM_NOTIFY
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
+{
+   // TODO:
+   return FALSE;
+}
+
+bool wxWindow::OS2OnNotify(int WXUNUSED(idCtrl),
+                           WXLPARAM lParam,
+                           WXLPARAM* WXUNUSED(result))
+{
+    // TODO:
+    return FALSE;
+}
+
+// ---------------------------------------------------------------------------
+// end session messages
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandleQueryEndSession(long logOff, bool *mayEnd)
+{
+    wxCloseEvent event(wxEVT_QUERY_END_SESSION, -1);
+    event.SetEventObject(wxTheApp);
+    event.SetCanVeto(TRUE);
+    event.SetLoggingOff(logOff == ENDSESSION_LOGOFF);
+
+    bool rc = wxTheApp->ProcessEvent(event);
+
+    if ( rc )
+    {
+        // we may end only if the app didn't veto session closing (double
+        // negation...)
+        *mayEnd = !event.GetVeto();
+    }
+
+    return rc;
+}
+
+bool wxWindow::HandleEndSession(bool endSession, long logOff)
+{
+    // do nothing if the session isn't ending
+    if ( !endSession )
+        return FALSE;
+
+    wxCloseEvent event(wxEVT_END_SESSION, -1);
+    event.SetEventObject(wxTheApp);
+    event.SetCanVeto(FALSE);
+    event.SetLoggingOff( (logOff == ENDSESSION_LOGOFF) );
+    if ( (this == wxTheApp->GetTopWindow()) && // Only send once
+        wxTheApp->ProcessEvent(event))
+    {
+    }
+    return TRUE;
+}
+
+// ---------------------------------------------------------------------------
+// window creation/destruction
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate)
+{
+    // TODO: should generate this event from WM_NCCREATE
+    wxWindowCreateEvent event(this);
+    (void)GetEventHandler()->ProcessEvent(event);
+
+    *mayCreate = TRUE;
+
+    return TRUE;
+}
+
+bool wxWindow::HandleDestroy()
+{
+    wxWindowDestroyEvent event(this);
+    (void)GetEventHandler()->ProcessEvent(event);
+
+    // delete our drop target if we've got one
+#if wxUSE_DRAG_AND_DROP
+    if ( m_dropTarget != NULL )
+    {
+        m_dropTarget->Revoke(m_hWnd);
+
+        delete m_dropTarget;
+        m_dropTarget = NULL;
+    }
+#endif // wxUSE_DRAG_AND_DROP
+
+    // WM_DESTROY handled
+    return TRUE;
+}
+
+// ---------------------------------------------------------------------------
+// activation/focus
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandleActivate(int state,
+                              bool WXUNUSED(minimized),
+                              WXHWND WXUNUSED(activate))
+{
+    wxActivateEvent event(wxEVT_ACTIVATE,
+                          (state == WA_ACTIVE) || (state == WA_CLICKACTIVE),
+                          m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindow::HandleSetFocus(WXHWND WXUNUSED(hwnd))
+{
+#if wxUSE_CARET
+    // Deal with caret
+    if ( m_caret )
+    {
+        m_caret->OnSetFocus();
+    }
+#endif // wxUSE_CARET
+
+    // panel wants to track the window which was the last to have focus in it
+    wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
+    if ( panel )
+    {
+        panel->SetLastFocus(this);
+    }
+
+    wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindow::HandleKillFocus(WXHWND WXUNUSED(hwnd))
+{
+#if wxUSE_CARET
+    // Deal with caret
+    if ( m_caret )
+    {
+        m_caret->OnKillFocus();
+    }
+#endif // wxUSE_CARET
+
+    wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+// ---------------------------------------------------------------------------
+// miscellaneous
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandleShow(bool show, int status)
+{
+    wxShowEvent event(GetId(), show);
+    event.m_eventObject = this;
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindow::HandleInitDialog(WXHWND WXUNUSED(hWndFocus))
+{
+    wxInitDialogEvent event(GetId());
+    event.m_eventObject = this;
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindow::HandleDropFiles(WXWPARAM wParam)
+{
+   // TODO:
+    return FALSE;
+}
+
+bool wxWindow::HandleSetCursor(WXHWND hWnd,
+                               short nHitTest,
+                               int WXUNUSED(mouseMsg))
+{
+    // don't set cursor for other windows, only for this one: this prevents
+    // children of this window from getting the same cursor as the parent has
+    // (don't forget that this message is propagated by default up the window
+    // parent-child hierarchy)
+    if ( GetHWND() == hWnd )
+    {
+        // don't set cursor when the mouse is not in the client part
+        if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+        {
+            HCURSOR hcursor = 0;
+            if ( wxIsBusy() )
+            {
+                // from msw\utils.cpp
+                extern HCURSOR gs_wxBusyCursor;
+
+                hcursor = gs_wxBusyCursor;
+            }
+            else
+            {
+                wxCursor *cursor = NULL;
+
+                if ( m_cursor.Ok() )
+                {
+                    cursor = &m_cursor;
+                }
+                else
+                {
+                    // from msw\data.cpp
+                    extern wxCursor *g_globalCursor;
+
+                    if ( g_globalCursor && g_globalCursor->Ok() )
+                        cursor = g_globalCursor;
+                }
+
+                if ( cursor )
+                    hcursor = (HCURSOR)cursor->GetHCURSOR();
+            }
+
+            if ( hcursor )
+            {
+//                ::SetCursor(hcursor);
+
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+// ---------------------------------------------------------------------------
+// owner drawn stuff
+// ---------------------------------------------------------------------------
+
+bool wxWindow::MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *itemStruct)
+{
+   // TODO:
+/*
+#if wxUSE_OWNER_DRAWN
+    // is it a menu item?
+    if ( id == 0 )
+    {
+        DRAWITEMSTRUCT *pDrawStruct = (DRAWITEMSTRUCT *)itemStruct;
+        wxMenuItem *pMenuItem = (wxMenuItem *)(pDrawStruct->itemData);
+
+        wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+
+        // prepare to call OnDrawItem()
+        wxDC dc;
+        dc.SetHDC((WXHDC)pDrawStruct->hDC, FALSE);
+        wxRect rect(pDrawStruct->rcItem.left, pDrawStruct->rcItem.top,
+                    pDrawStruct->rcItem.right - pDrawStruct->rcItem.left,
+                    pDrawStruct->rcItem.bottom - pDrawStruct->rcItem.top);
+
+        return pMenuItem->OnDrawItem
+                          (
+                            dc, rect,
+                            (wxOwnerDrawn::wxODAction)pDrawStruct->itemAction,
+                            (wxOwnerDrawn::wxODStatus)pDrawStruct->itemState
+                          );
+    }
+
+    wxWindow *item = FindItem(id);
+    if ( item && item->IsKindOf(CLASSINFO(wxControl)) )
+    {
+        return ((wxControl *)item)->MSWOnDraw(itemStruct);
+    }
+    else
+#endif
+        return FALSE;
+*/
+    return FALSE;
+}
+
+bool wxWindow::OS2OnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct)
 {
-    // TODO:
+   // TODO:
+/*
+#if wxUSE_OWNER_DRAWN
+    // is it a menu item?
+    if ( id == 0 )
+    {
+        MEASUREITEMSTRUCT *pMeasureStruct = (MEASUREITEMSTRUCT *)itemStruct;
+        wxMenuItem *pMenuItem = (wxMenuItem *)(pMeasureStruct->itemData);
+
+        wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+
+        return pMenuItem->OnMeasureItem(&pMeasureStruct->itemWidth,
+                                        &pMeasureStruct->itemHeight);
+    }
+
+    wxWindow *item = FindItem(id);
+    if ( item && item->IsKindOf(CLASSINFO(wxControl)) )
+    {
+        return ((wxControl *)item)->MSWOnMeasure(itemStruct);
+    }
+#endif  // owner-drawn menus
+*/
+    return FALSE;
 }
 
-#endif
+// ---------------------------------------------------------------------------
+// colours and palettes
+// ---------------------------------------------------------------------------
 
-void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
+bool wxWindow::HandleSysColorChange()
 {
-    // TODO:
+    wxSysColourChangedEvent event;
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-void wxWindow::OnDefaultAction(wxControl *initiatingItem)
+bool wxWindow::HandleCtlColor(WXHBRUSH *brush,
+                              WXHDC pDC,
+                              WXHWND pWnd,
+                              WXUINT nCtlColor,
+                              WXUINT message,
+                              WXWPARAM wParam,
+                              WXLPARAM lParam)
 {
-    // TODO:
+    WXHBRUSH hBrush = 0;
+
+    if ( nCtlColor == CTLCOLOR_DLG )
+    {
+        hBrush = OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam);
+    }
+    else
+    {
+        wxControl *item = (wxControl *)FindItemByHWND(pWnd, TRUE);
+        if ( item )
+            hBrush = item->OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam);
+    }
+
+    if ( hBrush )
+        *brush = hBrush;
+
+    return hBrush != 0;
 }
 
-void wxWindow::OnEraseBackground(wxEraseEvent& event)
+// Define for each class of dialog and control
+WXHBRUSH wxWindow::OnCtlColor(WXHDC hDC,
+                              WXHWND hWnd,
+                              WXUINT nCtlColor,
+                              WXUINT message,
+                              WXWPARAM wParam,
+                              WXLPARAM lParam)
 {
-    // TODO:
+    return (WXHBRUSH)0;
 }
 
-void wxWindow::OnChar(wxKeyEvent& event)
+bool wxWindow::HandlePaletteChanged(WXHWND hWndPalChange)
 {
-    // TODO:
+    wxPaletteChangedEvent event(GetId());
+    event.SetEventObject(this);
+    event.SetChangedWindow(wxFindWinFromHandle(hWndPalChange));
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-void wxWindow::OnKeyDown(wxKeyEvent& event)
+bool wxWindow::HandleQueryNewPalette()
 {
-    // TODO:
+    wxQueryNewPaletteEvent event(GetId());
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event) && event.GetPaletteRealized();
 }
 
-void wxWindow::OnKeyUp(wxKeyEvent& event)
+// Responds to colour changes: passes event on to children.
+void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event)
 {
-    // TODO:
+    wxNode *node = GetChildren().First();
+    while ( node )
+    {
+        // Only propagate to non-top-level windows
+        wxWindow *win = (wxWindow *)node->Data();
+        if ( win->GetParent() )
+        {
+            wxSysColourChangedEvent event2;
+            event.m_eventObject = win;
+            win->GetEventHandler()->ProcessEvent(event2);
+        }
+
+        node = node->Next();
+    }
 }
 
-void wxWindow::OnPaint(wxPaintEvent& event)
+// ---------------------------------------------------------------------------
+// painting
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandlePaint()
 {
-    // TODO:
+   // TODO:
+   Return FALSE;
 }
 
-void wxWindow::OnIdle(wxIdleEvent& event)
+bool wxWindow::HandleEraseBkgnd(WXHDC hdc)
 {
-    // TODO:
+    // Prevents flicker when dragging
+    if ( ::IsIconic(GetHwnd()) )
+        return TRUE;
+
+    wxDC dc;
+
+    dc.SetHDC(hdc);
+    dc.SetWindow(this);
+    dc.BeginDrawing();
+
+    wxEraseEvent event(m_windowId, &dc);
+    event.SetEventObject(this);
+    bool rc = GetEventHandler()->ProcessEvent(event);
+
+    dc.EndDrawing();
+    dc.SelectOldObjects(hdc);
+    dc.SetHDC((WXHDC) NULL);
+
+    return rc;
 }
 
-void wxWindow::OnInitDialog(wxInitDialogEvent& event)
+void wxWindow::OnEraseBackground(wxEraseEvent& event)
 {
     // TODO:
 }
 
+// ---------------------------------------------------------------------------
+// moving and resizing
+// ---------------------------------------------------------------------------
 
-wxPoint wxWindow::GetClientAreaOrigin() const
+bool wxWindow::HandleMinimize()
 {
-    // TODO:
-    return wxPoint(0, 0);
+    wxIconizeEvent event(m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
+bool wxWindow::HandleMaximize()
 {
-    // TODO:
+    wxMaximizeEvent event(m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-long wxWindow::Default()
+bool wxWindow::HandleMove(int x, int y)
 {
-    // TODO:
-    return(1);
+    wxMoveEvent event(wxPoint(x, y), m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-void wxWindow::UnsetConstraints(wxLayoutConstraints *c)
+bool wxWindow::HandleSize(int w, int h, WXUINT WXUNUSED(flag))
 {
-    // TODO:
+    wxSizeEvent event(wxSize(w, h), m_windowId);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-wxObject* wxWindow::GetChild(int number) const
+bool wxWindow::HandleGetMinMaxInfo(void *mmInfo)
 {
-    // TODO:
-    return((wxObject*)this);
+    MINMAXINFO *info = (MINMAXINFO *)mmInfo;
+
+    bool rc = FALSE;
+
+    if ( m_minWidth != -1 )
+    {
+        info->ptMinTrackSize.x = m_minWidth;
+        rc = TRUE;
+    }
+
+    if ( m_minHeight != -1 )
+    {
+        info->ptMinTrackSize.y = m_minHeight;
+        rc = TRUE;
+    }
+
+    if ( m_maxWidth != -1 )
+    {
+        info->ptMaxTrackSize.x = m_maxWidth;
+        rc = TRUE;
+    }
+
+    if ( m_maxHeight != -1 )
+    {
+        info->ptMaxTrackSize.y = m_maxHeight;
+        rc = TRUE;
+    }
+
+    return rc;
 }
 
-void wxWindow::PMDetachWindowMenu()
+// ---------------------------------------------------------------------------
+// command messages
+// ---------------------------------------------------------------------------
+
+bool wxWindow::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control)
 {
-    if ( m_hMenu )
+    if ( wxCurrentPopupMenu )
     {
-        HMENU hMenu = (HMENU)m_hMenu;
-
-        int N = (int)WinSendMsg(hMenu, MM_QUERYITEMCOUNT, 0, 0);
-        int i;
-        for (i = 0; i < N; i++)
-        {
-            wxChar buf[100];
-            int chars = (int)WinSendMsg(hMenu, MM_QUERYITEMTEXT, MPFROM2SHORT(i, N), buf);
-            if ( !chars )
-            {
-                wxLogLastError(wxT("GetMenuString"));
+        wxMenu *popupMenu = wxCurrentPopupMenu;
+        wxCurrentPopupMenu = NULL;
 
-                continue;
-            }
+        return popupMenu->MSWCommand(cmd, id);
+    }
 
-            if ( wxStrcmp(buf, wxT("&Window")) == 0 )
-            {
-                WinSendMsg(hMenu, MM_DELETEITEM, MPFROM2SHORT(i, TRUE), 0);
-                break;
-            }
-        }
+    wxWindow *win = FindItem(id);
+    if ( !win )
+    {
+        win = wxFindWinFromHandle(control);
     }
+
+    if ( win )
+        return win->MSWCommand(cmd, id);
+
+    return FALSE;
 }
 
-void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win)
+bool wxWindow::HandleSysCommand(WXWPARAM wParam, WXLPARAM lParam)
 {
-    // adding NULL hWnd is (first) surely a result of an error and
-    // (secondly) breaks menu command processing
-    wxCHECK_RET( hWnd != (HWND)NULL,
-                 wxT("attempt to add a NULL hWnd to window list ignored") );
+   // TODO:
+    return FALSE;
+}
+
+// ---------------------------------------------------------------------------
+// mouse events
+// ---------------------------------------------------------------------------
+
+void wxWindow::InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags)
+{
+    event.m_x = x;
+    event.m_y = y;
+    event.m_shiftDown = ((flags & MK_SHIFT) != 0);
+    event.m_controlDown = ((flags & MK_CONTROL) != 0);
+    event.m_leftDown = ((flags & MK_LBUTTON) != 0);
+    event.m_middleDown = ((flags & MK_MBUTTON) != 0);
+    event.m_rightDown = ((flags & MK_RBUTTON) != 0);
+    event.SetTimestamp(s_currentMsg.time);
+    event.m_eventObject = this;
+
+#if wxUSE_MOUSEEVENT_HACK
+    m_lastMouseX = x;
+    m_lastMouseY = y;
+    m_lastMouseEvent = event.GetEventType();
+#endif // wxUSE_MOUSEEVENT_HACK
 
-    if ( !wxWinHandleList->Find((long)hWnd) )
-        wxWinHandleList->Append((long)hWnd, win);
 }
 
-wxWindow *wxFindWinFromHandle(WXHWND hWnd)
+bool wxWindow::HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags)
 {
-    wxNode *node = wxWinHandleList->Find((long)hWnd);
-    if ( !node )
-        return NULL;
-    return (wxWindow *)node->Data();
+    // the mouse events take consecutive IDs from WM_MOUSEFIRST to
+    // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST
+    // from the message id and take the value in the table to get wxWin event
+    // id
+    static const wxEventType eventsMouse[] =
+    {
+        wxEVT_MOTION,
+        wxEVT_LEFT_DOWN,
+        wxEVT_LEFT_UP,
+        wxEVT_LEFT_DCLICK,
+        wxEVT_RIGHT_DOWN,
+        wxEVT_RIGHT_UP,
+        wxEVT_RIGHT_DCLICK,
+        wxEVT_MIDDLE_DOWN,
+        wxEVT_MIDDLE_UP,
+        wxEVT_MIDDLE_DCLICK
+    };
+
+    wxMouseEvent event(eventsMouse[msg - WM_MOUSEMOVE]);
+    InitMouseEvent(event, x, y, flags);
+
+    return GetEventHandler()->ProcessEvent(event);
 }
 
-void wxRemoveHandleAssociation(wxWindow *win)
+bool wxWindow::HandleMouseMove(int x, int y, WXUINT flags)
 {
-    wxWinHandleList->DeleteObject(win);
+    if ( !m_mouseInWindow )
+    {
+        // Generate an ENTER event
+        m_mouseInWindow = TRUE;
+
+        wxMouseEvent event(wxEVT_ENTER_WINDOW);
+        InitMouseEvent(event, x, y, flags);
+
+        (void)GetEventHandler()->ProcessEvent(event);
+    }
+
+#if wxUSE_MOUSEEVENT_HACK
+    // Window gets a click down message followed by a mouse move message even
+    // if position isn't changed!  We want to discard the trailing move event
+    // if x and y are the same.
+    if ( (m_lastMouseEvent == wxEVT_RIGHT_DOWN ||
+          m_lastMouseEvent == wxEVT_LEFT_DOWN ||
+          m_lastMouseEvent == wxEVT_MIDDLE_DOWN) &&
+         (m_lastMouseX == event.m_x && m_lastMouseY == event.m_y) )
+    {
+        m_lastMouseEvent = wxEVT_MOTION;
+
+        return FALSE;
+    }
+#endif // wxUSE_MOUSEEVENT_HACK
+
+    return HandleMouseEvent(WM_MOUSEMOVE, x, y, flags);
 }
 
-void wxWindow::SubclassWin(WXHWND hWnd)
+// ---------------------------------------------------------------------------
+// keyboard handling
+// ---------------------------------------------------------------------------
+
+// isASCII is TRUE only when we're called from WM_CHAR handler and not from
+// WM_KEYDOWN one
+bool wxWindow::HandleChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 {
-    wxASSERT_MSG( !m_oldWndProc, wxT("subclassing window twice?") );
+   // TODO:
+   return FALSE;
+}
 
-    HWND hwnd = (HWND)hWnd;
-/*
-* TODO: implement something like this:
-*   wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in SubclassWin") );
-*
-*   wxAssociateWinWithHandle(hwnd, this);
-*
-*   m_oldWndProc = (WXFARPROC) GetWindowLong(hwnd, GWL_WNDPROC);
-*   SetWindowLong(hwnd, GWL_WNDPROC, (LONG) wxWndProc);
-*/
+bool wxWindow::HandleKeyDown(WXWORD wParam, WXLPARAM lParam)
+{
+   // TODO:
+   return FALSE;
 }
 
-void wxWindow::UnsubclassWin()
+bool wxWindow::HandleKeyUp(WXWORD wParam, WXLPARAM lParam)
 {
-/*
-* TODO:
+   // TODO:
+   return FALSE;
+}
 
-    wxRemoveHandleAssociation(this);
+// ---------------------------------------------------------------------------
+// joystick
+// ---------------------------------------------------------------------------
 
-    // Restore old Window proc
-    HWND hwnd = GetHwnd();
-    if ( hwnd )
+bool wxWindow::HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags)
+{
+   // TODO:
+   return FALSE;
+}
+
+// ---------------------------------------------------------------------------
+// scrolling
+// ---------------------------------------------------------------------------
+
+bool wxWindow::OS2OnScroll(int orientation, WXWORD wParam,
+                           WXWORD pos, WXHWND control)
+{
+    if ( control )
     {
-        m_hWnd = 0;
+        wxWindow *child = wxFindWinFromHandle(control);
+        if ( child )
+            return child->MSWOnScroll(orientation, wParam, pos, control);
+    }
 
-        wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in UnsubclassWin") );
+    wxScrollWinEvent event;
+    event.SetPosition(pos);
+    event.SetOrientation(orientation);
+    event.m_eventObject = this;
+   // TODO:
+   return FALSE;
+}
 
-        FARPROC farProc = (FARPROC) GetWindowLong(hwnd, GWL_WNDPROC);
-        if ( (m_oldWndProc != 0) && (farProc != (FARPROC) m_oldWndProc) )
+// ===========================================================================
+// global functions
+// ===========================================================================
+
+void wxGetCharSize(WXHWND wnd, int *x, int *y,wxFont *the_font)
+{
+   // TODO:
+}
+
+// Returns 0 if was a normal ASCII value, not a special key. This indicates that
+// the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
+int wxCharCodeOS2ToWX(int keySym)
+{
+    int id = 0;
+   // TODO:
+/*
+    switch (keySym)
+    {
+    case VK_CANCEL:     id = WXK_CANCEL; break;
+    case VK_BACK:       id = WXK_BACK; break;
+    case VK_TAB:        id = WXK_TAB; break;
+    case VK_CLEAR:      id = WXK_CLEAR; break;
+    case VK_RETURN:     id = WXK_RETURN; break;
+    case VK_SHIFT:      id = WXK_SHIFT; break;
+    case VK_CONTROL:    id = WXK_CONTROL; break;
+    case VK_MENU :      id = WXK_MENU; break;
+    case VK_PAUSE:      id = WXK_PAUSE; break;
+    case VK_SPACE:      id = WXK_SPACE; break;
+    case VK_ESCAPE:     id = WXK_ESCAPE; break;
+    case VK_PRIOR:      id = WXK_PRIOR; break;
+    case VK_NEXT :      id = WXK_NEXT; break;
+    case VK_END:        id = WXK_END; break;
+    case VK_HOME :      id = WXK_HOME; break;
+    case VK_LEFT :      id = WXK_LEFT; break;
+    case VK_UP:         id = WXK_UP; break;
+    case VK_RIGHT:      id = WXK_RIGHT; break;
+    case VK_DOWN :      id = WXK_DOWN; break;
+    case VK_SELECT:     id = WXK_SELECT; break;
+    case VK_PRINT:      id = WXK_PRINT; break;
+    case VK_EXECUTE:    id = WXK_EXECUTE; break;
+    case VK_INSERT:     id = WXK_INSERT; break;
+    case VK_DELETE:     id = WXK_DELETE; break;
+    case VK_HELP :      id = WXK_HELP; break;
+    case VK_NUMPAD0:    id = WXK_NUMPAD0; break;
+    case VK_NUMPAD1:    id = WXK_NUMPAD1; break;
+    case VK_NUMPAD2:    id = WXK_NUMPAD2; break;
+    case VK_NUMPAD3:    id = WXK_NUMPAD3; break;
+    case VK_NUMPAD4:    id = WXK_NUMPAD4; break;
+    case VK_NUMPAD5:    id = WXK_NUMPAD5; break;
+    case VK_NUMPAD6:    id = WXK_NUMPAD6; break;
+    case VK_NUMPAD7:    id = WXK_NUMPAD7; break;
+    case VK_NUMPAD8:    id = WXK_NUMPAD8; break;
+    case VK_NUMPAD9:    id = WXK_NUMPAD9; break;
+    case VK_MULTIPLY:   id = WXK_MULTIPLY; break;
+    case VK_ADD:        id = WXK_ADD; break;
+    case VK_SUBTRACT:   id = WXK_SUBTRACT; break;
+    case VK_DECIMAL:    id = WXK_DECIMAL; break;
+    case VK_DIVIDE:     id = WXK_DIVIDE; break;
+    case VK_F1:         id = WXK_F1; break;
+    case VK_F2:         id = WXK_F2; break;
+    case VK_F3:         id = WXK_F3; break;
+    case VK_F4:         id = WXK_F4; break;
+    case VK_F5:         id = WXK_F5; break;
+    case VK_F6:         id = WXK_F6; break;
+    case VK_F7:         id = WXK_F7; break;
+    case VK_F8:         id = WXK_F8; break;
+    case VK_F9:         id = WXK_F9; break;
+    case VK_F10:        id = WXK_F10; break;
+    case VK_F11:        id = WXK_F11; break;
+    case VK_F12:        id = WXK_F12; break;
+    case VK_F13:        id = WXK_F13; break;
+    case VK_F14:        id = WXK_F14; break;
+    case VK_F15:        id = WXK_F15; break;
+    case VK_F16:        id = WXK_F16; break;
+    case VK_F17:        id = WXK_F17; break;
+    case VK_F18:        id = WXK_F18; break;
+    case VK_F19:        id = WXK_F19; break;
+    case VK_F20:        id = WXK_F20; break;
+    case VK_F21:        id = WXK_F21; break;
+    case VK_F22:        id = WXK_F22; break;
+    case VK_F23:        id = WXK_F23; break;
+    case VK_F24:        id = WXK_F24; break;
+    case VK_NUMLOCK:    id = WXK_NUMLOCK; break;
+    case VK_SCROLL:     id = WXK_SCROLL; break;
+    default:
         {
-            SetWindowLong(hwnd, GWL_WNDPROC, (LONG) m_oldWndProc);
-            m_oldWndProc = 0;
+            return 0;
         }
     }
 */
+    return id;
 }
 
-WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle,
-                                     bool *want3D) const
+int wxCharCodeWXToOS2(int id, bool *isVirtual)
 {
-   DWORD exStyle; // remove after implementation doe
-/* TODO:  this ought to be fun
-*
-    // If matches certain criteria, then assume no 3D effects
-    // unless specifically requested (dealt with in MakeExtendedStyle)
-    if ( !GetParent() || !IsKindOf(CLASSINFO(wxControl)) || (m_windowStyle & wxNO_BORDER) )
+    *isVirtual = TRUE;
+    int keySym = 0;
+    // TODO
+/*
+    switch (id)
     {
-        *want3D = FALSE;
-        return MakeExtendedStyle(m_windowStyle, FALSE);
+    case WXK_CANCEL:    keySym = VK_CANCEL; break;
+    case WXK_CLEAR:     keySym = VK_CLEAR; break;
+    case WXK_SHIFT:     keySym = VK_SHIFT; break;
+    case WXK_CONTROL:   keySym = VK_CONTROL; break;
+    case WXK_MENU :     keySym = VK_MENU; break;
+    case WXK_PAUSE:     keySym = VK_PAUSE; break;
+    case WXK_PRIOR:     keySym = VK_PRIOR; break;
+    case WXK_NEXT :     keySym = VK_NEXT; break;
+    case WXK_END:       keySym = VK_END; break;
+    case WXK_HOME :     keySym = VK_HOME; break;
+    case WXK_LEFT :     keySym = VK_LEFT; break;
+    case WXK_UP:        keySym = VK_UP; break;
+    case WXK_RIGHT:     keySym = VK_RIGHT; break;
+    case WXK_DOWN :     keySym = VK_DOWN; break;
+    case WXK_SELECT:    keySym = VK_SELECT; break;
+    case WXK_PRINT:     keySym = VK_PRINT; break;
+    case WXK_EXECUTE:   keySym = VK_EXECUTE; break;
+    case WXK_INSERT:    keySym = VK_INSERT; break;
+    case WXK_DELETE:    keySym = VK_DELETE; break;
+    case WXK_HELP :     keySym = VK_HELP; break;
+    case WXK_NUMPAD0:   keySym = VK_NUMPAD0; break;
+    case WXK_NUMPAD1:   keySym = VK_NUMPAD1; break;
+    case WXK_NUMPAD2:   keySym = VK_NUMPAD2; break;
+    case WXK_NUMPAD3:   keySym = VK_NUMPAD3; break;
+    case WXK_NUMPAD4:   keySym = VK_NUMPAD4; break;
+    case WXK_NUMPAD5:   keySym = VK_NUMPAD5; break;
+    case WXK_NUMPAD6:   keySym = VK_NUMPAD6; break;
+    case WXK_NUMPAD7:   keySym = VK_NUMPAD7; break;
+    case WXK_NUMPAD8:   keySym = VK_NUMPAD8; break;
+    case WXK_NUMPAD9:   keySym = VK_NUMPAD9; break;
+    case WXK_MULTIPLY:  keySym = VK_MULTIPLY; break;
+    case WXK_ADD:       keySym = VK_ADD; break;
+    case WXK_SUBTRACT:  keySym = VK_SUBTRACT; break;
+    case WXK_DECIMAL:   keySym = VK_DECIMAL; break;
+    case WXK_DIVIDE:    keySym = VK_DIVIDE; break;
+    case WXK_F1:        keySym = VK_F1; break;
+    case WXK_F2:        keySym = VK_F2; break;
+    case WXK_F3:        keySym = VK_F3; break;
+    case WXK_F4:        keySym = VK_F4; break;
+    case WXK_F5:        keySym = VK_F5; break;
+    case WXK_F6:        keySym = VK_F6; break;
+    case WXK_F7:        keySym = VK_F7; break;
+    case WXK_F8:        keySym = VK_F8; break;
+    case WXK_F9:        keySym = VK_F9; break;
+    case WXK_F10:       keySym = VK_F10; break;
+    case WXK_F11:       keySym = VK_F11; break;
+    case WXK_F12:       keySym = VK_F12; break;
+    case WXK_F13:       keySym = VK_F13; break;
+    case WXK_F14:       keySym = VK_F14; break;
+    case WXK_F15:       keySym = VK_F15; break;
+    case WXK_F16:       keySym = VK_F16; break;
+    case WXK_F17:       keySym = VK_F17; break;
+    case WXK_F18:       keySym = VK_F18; break;
+    case WXK_F19:       keySym = VK_F19; break;
+    case WXK_F20:       keySym = VK_F20; break;
+    case WXK_F21:       keySym = VK_F21; break;
+    case WXK_F22:       keySym = VK_F22; break;
+    case WXK_F23:       keySym = VK_F23; break;
+    case WXK_F24:       keySym = VK_F24; break;
+    case WXK_NUMLOCK:   keySym = VK_NUMLOCK; break;
+    case WXK_SCROLL:    keySym = VK_SCROLL; break;
+    default:
+        {
+            *isVirtual = FALSE;
+            keySym = id;
+            break;
+        }
     }
+*/
+    return keySym;
+}
 
-    // Determine whether we should be using 3D effects or not.
-    bool nativeBorder = FALSE; // by default, we don't want a Win95 effect
+wxWindow *wxGetActiveWindow()
+{
+   // TODO
+    return NULL;
+}
 
-    // 1) App can specify global 3D effects
-    *want3D = wxTheApp->GetAuto3D();
+// Windows keyboard hook. Allows interception of e.g. F1, ESCAPE
+// in active frames and dialogs, regardless of where the focus is.
+static HHOOK wxTheKeyboardHook = 0;
+static FARPROC wxTheKeyboardHookProc = 0;
+int wxKeyboardHook(int nCode, WORD wParam, DWORD lParam);
 
-    // 2) If the parent is being drawn with user colours, or simple border specified,
-    // switch effects off. TODO: replace wxUSER_COLOURS with wxNO_3D
-    if ( GetParent() && (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) || (m_windowStyle & wxSIMPLE_BORDER) )
-        *want3D = FALSE;
+void wxSetKeyboardHook(bool doIt)
+{
+   // TODO:
+}
 
-    // 3) Control can override this global setting by defining
-    // a border style, e.g. wxSUNKEN_BORDER
-    if ( m_windowStyle & wxSUNKEN_BORDER  )
-        *want3D = TRUE;
+int wxKeyboardHook(int nCode, WORD wParam, DWORD lParam)
+{
+   // TODO:
 
-    // 4) If it's a special border, CTL3D can't cope so we want a native border
-    if ( (m_windowStyle & wxDOUBLE_BORDER) || (m_windowStyle & wxRAISED_BORDER) ||
-        (m_windowStyle & wxSTATIC_BORDER) )
+    return 0;
+}
+
+#ifdef __WXDEBUG__
+const char *wxGetMessageName(int message)
+{
+   // TODO
+/*
+    switch ( message )
     {
-        *want3D = TRUE;
-        nativeBorder = TRUE;
+        case 0x0000: return "WM_NULL";
+        case 0x0001: return "WM_CREATE";
+        case 0x0002: return "WM_DESTROY";
+        case 0x0003: return "WM_MOVE";
+        case 0x0005: return "WM_SIZE";
+        case 0x0006: return "WM_ACTIVATE";
+        case 0x0007: return "WM_SETFOCUS";
+        case 0x0008: return "WM_KILLFOCUS";
+        case 0x000A: return "WM_ENABLE";
+        case 0x000B: return "WM_SETREDRAW";
+        case 0x000C: return "WM_SETTEXT";
+        case 0x000D: return "WM_GETTEXT";
+        case 0x000E: return "WM_GETTEXTLENGTH";
+        case 0x000F: return "WM_PAINT";
+        case 0x0010: return "WM_CLOSE";
+        case 0x0011: return "WM_QUERYENDSESSION";
+        case 0x0012: return "WM_QUIT";
+        case 0x0013: return "WM_QUERYOPEN";
+        case 0x0014: return "WM_ERASEBKGND";
+        case 0x0015: return "WM_SYSCOLORCHANGE";
+        case 0x0016: return "WM_ENDSESSION";
+        case 0x0017: return "WM_SYSTEMERROR";
+        case 0x0018: return "WM_SHOWWINDOW";
+        case 0x0019: return "WM_CTLCOLOR";
+        case 0x001A: return "WM_WININICHANGE";
+        case 0x001B: return "WM_DEVMODECHANGE";
+        case 0x001C: return "WM_ACTIVATEAPP";
+        case 0x001D: return "WM_FONTCHANGE";
+        case 0x001E: return "WM_TIMECHANGE";
+        case 0x001F: return "WM_CANCELMODE";
+        case 0x0020: return "WM_SETCURSOR";
+        case 0x0021: return "WM_MOUSEACTIVATE";
+        case 0x0022: return "WM_CHILDACTIVATE";
+        case 0x0023: return "WM_QUEUESYNC";
+        case 0x0024: return "WM_GETMINMAXINFO";
+        case 0x0026: return "WM_PAINTICON";
+        case 0x0027: return "WM_ICONERASEBKGND";
+        case 0x0028: return "WM_NEXTDLGCTL";
+        case 0x002A: return "WM_SPOOLERSTATUS";
+        case 0x002B: return "WM_DRAWITEM";
+        case 0x002C: return "WM_MEASUREITEM";
+        case 0x002D: return "WM_DELETEITEM";
+        case 0x002E: return "WM_VKEYTOITEM";
+        case 0x002F: return "WM_CHARTOITEM";
+        case 0x0030: return "WM_SETFONT";
+        case 0x0031: return "WM_GETFONT";
+        case 0x0037: return "WM_QUERYDRAGICON";
+        case 0x0039: return "WM_COMPAREITEM";
+        case 0x0041: return "WM_COMPACTING";
+        case 0x0044: return "WM_COMMNOTIFY";
+        case 0x0046: return "WM_WINDOWPOSCHANGING";
+        case 0x0047: return "WM_WINDOWPOSCHANGED";
+        case 0x0048: return "WM_POWER";
+
+#ifdef  __WIN32__
+        case 0x004A: return "WM_COPYDATA";
+        case 0x004B: return "WM_CANCELJOURNAL";
+        case 0x004E: return "WM_NOTIFY";
+        case 0x0050: return "WM_INPUTLANGCHANGEREQUEST";
+        case 0x0051: return "WM_INPUTLANGCHANGE";
+        case 0x0052: return "WM_TCARD";
+        case 0x0053: return "WM_HELP";
+        case 0x0054: return "WM_USERCHANGED";
+        case 0x0055: return "WM_NOTIFYFORMAT";
+        case 0x007B: return "WM_CONTEXTMENU";
+        case 0x007C: return "WM_STYLECHANGING";
+        case 0x007D: return "WM_STYLECHANGED";
+        case 0x007E: return "WM_DISPLAYCHANGE";
+        case 0x007F: return "WM_GETICON";
+        case 0x0080: return "WM_SETICON";
+#endif  //WIN32
+
+        case 0x0081: return "WM_NCCREATE";
+        case 0x0082: return "WM_NCDESTROY";
+        case 0x0083: return "WM_NCCALCSIZE";
+        case 0x0084: return "WM_NCHITTEST";
+        case 0x0085: return "WM_NCPAINT";
+        case 0x0086: return "WM_NCACTIVATE";
+        case 0x0087: return "WM_GETDLGCODE";
+        case 0x00A0: return "WM_NCMOUSEMOVE";
+        case 0x00A1: return "WM_NCLBUTTONDOWN";
+        case 0x00A2: return "WM_NCLBUTTONUP";
+        case 0x00A3: return "WM_NCLBUTTONDBLCLK";
+        case 0x00A4: return "WM_NCRBUTTONDOWN";
+        case 0x00A5: return "WM_NCRBUTTONUP";
+        case 0x00A6: return "WM_NCRBUTTONDBLCLK";
+        case 0x00A7: return "WM_NCMBUTTONDOWN";
+        case 0x00A8: return "WM_NCMBUTTONUP";
+        case 0x00A9: return "WM_NCMBUTTONDBLCLK";
+        case 0x0100: return "WM_KEYDOWN";
+        case 0x0101: return "WM_KEYUP";
+        case 0x0102: return "WM_CHAR";
+        case 0x0103: return "WM_DEADCHAR";
+        case 0x0104: return "WM_SYSKEYDOWN";
+        case 0x0105: return "WM_SYSKEYUP";
+        case 0x0106: return "WM_SYSCHAR";
+        case 0x0107: return "WM_SYSDEADCHAR";
+        case 0x0108: return "WM_KEYLAST";
+
+#ifdef  __WIN32__
+        case 0x010D: return "WM_IME_STARTCOMPOSITION";
+        case 0x010E: return "WM_IME_ENDCOMPOSITION";
+        case 0x010F: return "WM_IME_COMPOSITION";
+#endif  //WIN32
+
+        case 0x0110: return "WM_INITDIALOG";
+        case 0x0111: return "WM_COMMAND";
+        case 0x0112: return "WM_SYSCOMMAND";
+        case 0x0113: return "WM_TIMER";
+        case 0x0114: return "WM_HSCROLL";
+        case 0x0115: return "WM_VSCROLL";
+        case 0x0116: return "WM_INITMENU";
+        case 0x0117: return "WM_INITMENUPOPUP";
+        case 0x011F: return "WM_MENUSELECT";
+        case 0x0120: return "WM_MENUCHAR";
+        case 0x0121: return "WM_ENTERIDLE";
+        case 0x0200: return "WM_MOUSEMOVE";
+        case 0x0201: return "WM_LBUTTONDOWN";
+        case 0x0202: return "WM_LBUTTONUP";
+        case 0x0203: return "WM_LBUTTONDBLCLK";
+        case 0x0204: return "WM_RBUTTONDOWN";
+        case 0x0205: return "WM_RBUTTONUP";
+        case 0x0206: return "WM_RBUTTONDBLCLK";
+        case 0x0207: return "WM_MBUTTONDOWN";
+        case 0x0208: return "WM_MBUTTONUP";
+        case 0x0209: return "WM_MBUTTONDBLCLK";
+        case 0x0210: return "WM_PARENTNOTIFY";
+        case 0x0211: return "WM_ENTERMENULOOP";
+        case 0x0212: return "WM_EXITMENULOOP";
+
+#ifdef  __WIN32__
+        case 0x0213: return "WM_NEXTMENU";
+        case 0x0214: return "WM_SIZING";
+        case 0x0215: return "WM_CAPTURECHANGED";
+        case 0x0216: return "WM_MOVING";
+        case 0x0218: return "WM_POWERBROADCAST";
+        case 0x0219: return "WM_DEVICECHANGE";
+#endif  //WIN32
+
+        case 0x0220: return "WM_MDICREATE";
+        case 0x0221: return "WM_MDIDESTROY";
+        case 0x0222: return "WM_MDIACTIVATE";
+        case 0x0223: return "WM_MDIRESTORE";
+        case 0x0224: return "WM_MDINEXT";
+        case 0x0225: return "WM_MDIMAXIMIZE";
+        case 0x0226: return "WM_MDITILE";
+        case 0x0227: return "WM_MDICASCADE";
+        case 0x0228: return "WM_MDIICONARRANGE";
+        case 0x0229: return "WM_MDIGETACTIVE";
+        case 0x0230: return "WM_MDISETMENU";
+        case 0x0233: return "WM_DROPFILES";
+
+#ifdef  __WIN32__
+        case 0x0281: return "WM_IME_SETCONTEXT";
+        case 0x0282: return "WM_IME_NOTIFY";
+        case 0x0283: return "WM_IME_CONTROL";
+        case 0x0284: return "WM_IME_COMPOSITIONFULL";
+        case 0x0285: return "WM_IME_SELECT";
+        case 0x0286: return "WM_IME_CHAR";
+        case 0x0290: return "WM_IME_KEYDOWN";
+        case 0x0291: return "WM_IME_KEYUP";
+#endif  //WIN32
+
+        case 0x0300: return "WM_CUT";
+        case 0x0301: return "WM_COPY";
+        case 0x0302: return "WM_PASTE";
+        case 0x0303: return "WM_CLEAR";
+        case 0x0304: return "WM_UNDO";
+        case 0x0305: return "WM_RENDERFORMAT";
+        case 0x0306: return "WM_RENDERALLFORMATS";
+        case 0x0307: return "WM_DESTROYCLIPBOARD";
+        case 0x0308: return "WM_DRAWCLIPBOARD";
+        case 0x0309: return "WM_PAINTCLIPBOARD";
+        case 0x030A: return "WM_VSCROLLCLIPBOARD";
+        case 0x030B: return "WM_SIZECLIPBOARD";
+        case 0x030C: return "WM_ASKCBFORMATNAME";
+        case 0x030D: return "WM_CHANGECBCHAIN";
+        case 0x030E: return "WM_HSCROLLCLIPBOARD";
+        case 0x030F: return "WM_QUERYNEWPALETTE";
+        case 0x0310: return "WM_PALETTEISCHANGING";
+        case 0x0311: return "WM_PALETTECHANGED";
+
+#ifdef __WIN32__
+        // common controls messages - although they're not strictly speaking
+        // standard, it's nice to decode them nevertheless
+
+        // listview
+        case 0x1000 + 0: return "LVM_GETBKCOLOR";
+        case 0x1000 + 1: return "LVM_SETBKCOLOR";
+        case 0x1000 + 2: return "LVM_GETIMAGELIST";
+        case 0x1000 + 3: return "LVM_SETIMAGELIST";
+        case 0x1000 + 4: return "LVM_GETITEMCOUNT";
+        case 0x1000 + 5: return "LVM_GETITEMA";
+        case 0x1000 + 75: return "LVM_GETITEMW";
+        case 0x1000 + 6: return "LVM_SETITEMA";
+        case 0x1000 + 76: return "LVM_SETITEMW";
+        case 0x1000 + 7: return "LVM_INSERTITEMA";
+        case 0x1000 + 77: return "LVM_INSERTITEMW";
+        case 0x1000 + 8: return "LVM_DELETEITEM";
+        case 0x1000 + 9: return "LVM_DELETEALLITEMS";
+        case 0x1000 + 10: return "LVM_GETCALLBACKMASK";
+        case 0x1000 + 11: return "LVM_SETCALLBACKMASK";
+        case 0x1000 + 12: return "LVM_GETNEXTITEM";
+        case 0x1000 + 13: return "LVM_FINDITEMA";
+        case 0x1000 + 83: return "LVM_FINDITEMW";
+        case 0x1000 + 14: return "LVM_GETITEMRECT";
+        case 0x1000 + 15: return "LVM_SETITEMPOSITION";
+        case 0x1000 + 16: return "LVM_GETITEMPOSITION";
+        case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA";
+        case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW";
+        case 0x1000 + 18: return "LVM_HITTEST";
+        case 0x1000 + 19: return "LVM_ENSUREVISIBLE";
+        case 0x1000 + 20: return "LVM_SCROLL";
+        case 0x1000 + 21: return "LVM_REDRAWITEMS";
+        case 0x1000 + 22: return "LVM_ARRANGE";
+        case 0x1000 + 23: return "LVM_EDITLABELA";
+        case 0x1000 + 118: return "LVM_EDITLABELW";
+        case 0x1000 + 24: return "LVM_GETEDITCONTROL";
+        case 0x1000 + 25: return "LVM_GETCOLUMNA";
+        case 0x1000 + 95: return "LVM_GETCOLUMNW";
+        case 0x1000 + 26: return "LVM_SETCOLUMNA";
+        case 0x1000 + 96: return "LVM_SETCOLUMNW";
+        case 0x1000 + 27: return "LVM_INSERTCOLUMNA";
+        case 0x1000 + 97: return "LVM_INSERTCOLUMNW";
+        case 0x1000 + 28: return "LVM_DELETECOLUMN";
+        case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH";
+        case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH";
+        case 0x1000 + 31: return "LVM_GETHEADER";
+        case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE";
+        case 0x1000 + 34: return "LVM_GETVIEWRECT";
+        case 0x1000 + 35: return "LVM_GETTEXTCOLOR";
+        case 0x1000 + 36: return "LVM_SETTEXTCOLOR";
+        case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR";
+        case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR";
+        case 0x1000 + 39: return "LVM_GETTOPINDEX";
+        case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE";
+        case 0x1000 + 41: return "LVM_GETORIGIN";
+        case 0x1000 + 42: return "LVM_UPDATE";
+        case 0x1000 + 43: return "LVM_SETITEMSTATE";
+        case 0x1000 + 44: return "LVM_GETITEMSTATE";
+        case 0x1000 + 45: return "LVM_GETITEMTEXTA";
+        case 0x1000 + 115: return "LVM_GETITEMTEXTW";
+        case 0x1000 + 46: return "LVM_SETITEMTEXTA";
+        case 0x1000 + 116: return "LVM_SETITEMTEXTW";
+        case 0x1000 + 47: return "LVM_SETITEMCOUNT";
+        case 0x1000 + 48: return "LVM_SORTITEMS";
+        case 0x1000 + 49: return "LVM_SETITEMPOSITION32";
+        case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT";
+        case 0x1000 + 51: return "LVM_GETITEMSPACING";
+        case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA";
+        case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW";
+        case 0x1000 + 53: return "LVM_SETICONSPACING";
+        case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE";
+        case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE";
+        case 0x1000 + 56: return "LVM_GETSUBITEMRECT";
+        case 0x1000 + 57: return "LVM_SUBITEMHITTEST";
+        case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY";
+        case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY";
+        case 0x1000 + 60: return "LVM_SETHOTITEM";
+        case 0x1000 + 61: return "LVM_GETHOTITEM";
+        case 0x1000 + 62: return "LVM_SETHOTCURSOR";
+        case 0x1000 + 63: return "LVM_GETHOTCURSOR";
+        case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT";
+        case 0x1000 + 65: return "LVM_SETWORKAREA";
+
+        // tree view
+        case 0x1100 + 0: return "TVM_INSERTITEMA";
+        case 0x1100 + 50: return "TVM_INSERTITEMW";
+        case 0x1100 + 1: return "TVM_DELETEITEM";
+        case 0x1100 + 2: return "TVM_EXPAND";
+        case 0x1100 + 4: return "TVM_GETITEMRECT";
+        case 0x1100 + 5: return "TVM_GETCOUNT";
+        case 0x1100 + 6: return "TVM_GETINDENT";
+        case 0x1100 + 7: return "TVM_SETINDENT";
+        case 0x1100 + 8: return "TVM_GETIMAGELIST";
+        case 0x1100 + 9: return "TVM_SETIMAGELIST";
+        case 0x1100 + 10: return "TVM_GETNEXTITEM";
+        case 0x1100 + 11: return "TVM_SELECTITEM";
+        case 0x1100 + 12: return "TVM_GETITEMA";
+        case 0x1100 + 62: return "TVM_GETITEMW";
+        case 0x1100 + 13: return "TVM_SETITEMA";
+        case 0x1100 + 63: return "TVM_SETITEMW";
+        case 0x1100 + 14: return "TVM_EDITLABELA";
+        case 0x1100 + 65: return "TVM_EDITLABELW";
+        case 0x1100 + 15: return "TVM_GETEDITCONTROL";
+        case 0x1100 + 16: return "TVM_GETVISIBLECOUNT";
+        case 0x1100 + 17: return "TVM_HITTEST";
+        case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE";
+        case 0x1100 + 19: return "TVM_SORTCHILDREN";
+        case 0x1100 + 20: return "TVM_ENSUREVISIBLE";
+        case 0x1100 + 21: return "TVM_SORTCHILDRENCB";
+        case 0x1100 + 22: return "TVM_ENDEDITLABELNOW";
+        case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA";
+        case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW";
+        case 0x1100 + 24: return "TVM_SETTOOLTIPS";
+        case 0x1100 + 25: return "TVM_GETTOOLTIPS";
+
+        // header
+        case 0x1200 + 0: return "HDM_GETITEMCOUNT";
+        case 0x1200 + 1: return "HDM_INSERTITEMA";
+        case 0x1200 + 10: return "HDM_INSERTITEMW";
+        case 0x1200 + 2: return "HDM_DELETEITEM";
+        case 0x1200 + 3: return "HDM_GETITEMA";
+        case 0x1200 + 11: return "HDM_GETITEMW";
+        case 0x1200 + 4: return "HDM_SETITEMA";
+        case 0x1200 + 12: return "HDM_SETITEMW";
+        case 0x1200 + 5: return "HDM_LAYOUT";
+        case 0x1200 + 6: return "HDM_HITTEST";
+        case 0x1200 + 7: return "HDM_GETITEMRECT";
+        case 0x1200 + 8: return "HDM_SETIMAGELIST";
+        case 0x1200 + 9: return "HDM_GETIMAGELIST";
+        case 0x1200 + 15: return "HDM_ORDERTOINDEX";
+        case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE";
+        case 0x1200 + 17: return "HDM_GETORDERARRAY";
+        case 0x1200 + 18: return "HDM_SETORDERARRAY";
+        case 0x1200 + 19: return "HDM_SETHOTDIVIDER";
+
+        // tab control
+        case 0x1300 + 2: return "TCM_GETIMAGELIST";
+        case 0x1300 + 3: return "TCM_SETIMAGELIST";
+        case 0x1300 + 4: return "TCM_GETITEMCOUNT";
+        case 0x1300 + 5: return "TCM_GETITEMA";
+        case 0x1300 + 60: return "TCM_GETITEMW";
+        case 0x1300 + 6: return "TCM_SETITEMA";
+        case 0x1300 + 61: return "TCM_SETITEMW";
+        case 0x1300 + 7: return "TCM_INSERTITEMA";
+        case 0x1300 + 62: return "TCM_INSERTITEMW";
+        case 0x1300 + 8: return "TCM_DELETEITEM";
+        case 0x1300 + 9: return "TCM_DELETEALLITEMS";
+        case 0x1300 + 10: return "TCM_GETITEMRECT";
+        case 0x1300 + 11: return "TCM_GETCURSEL";
+        case 0x1300 + 12: return "TCM_SETCURSEL";
+        case 0x1300 + 13: return "TCM_HITTEST";
+        case 0x1300 + 14: return "TCM_SETITEMEXTRA";
+        case 0x1300 + 40: return "TCM_ADJUSTRECT";
+        case 0x1300 + 41: return "TCM_SETITEMSIZE";
+        case 0x1300 + 42: return "TCM_REMOVEIMAGE";
+        case 0x1300 + 43: return "TCM_SETPADDING";
+        case 0x1300 + 44: return "TCM_GETROWCOUNT";
+        case 0x1300 + 45: return "TCM_GETTOOLTIPS";
+        case 0x1300 + 46: return "TCM_SETTOOLTIPS";
+        case 0x1300 + 47: return "TCM_GETCURFOCUS";
+        case 0x1300 + 48: return "TCM_SETCURFOCUS";
+        case 0x1300 + 49: return "TCM_SETMINTABWIDTH";
+        case 0x1300 + 50: return "TCM_DESELECTALL";
+
+        // toolbar
+        case WM_USER+1: return "TB_ENABLEBUTTON";
+        case WM_USER+2: return "TB_CHECKBUTTON";
+        case WM_USER+3: return "TB_PRESSBUTTON";
+        case WM_USER+4: return "TB_HIDEBUTTON";
+        case WM_USER+5: return "TB_INDETERMINATE";
+        case WM_USER+9: return "TB_ISBUTTONENABLED";
+        case WM_USER+10: return "TB_ISBUTTONCHECKED";
+        case WM_USER+11: return "TB_ISBUTTONPRESSED";
+        case WM_USER+12: return "TB_ISBUTTONHIDDEN";
+        case WM_USER+13: return "TB_ISBUTTONINDETERMINATE";
+        case WM_USER+17: return "TB_SETSTATE";
+        case WM_USER+18: return "TB_GETSTATE";
+        case WM_USER+19: return "TB_ADDBITMAP";
+        case WM_USER+20: return "TB_ADDBUTTONS";
+        case WM_USER+21: return "TB_INSERTBUTTON";
+        case WM_USER+22: return "TB_DELETEBUTTON";
+        case WM_USER+23: return "TB_GETBUTTON";
+        case WM_USER+24: return "TB_BUTTONCOUNT";
+        case WM_USER+25: return "TB_COMMANDTOINDEX";
+        case WM_USER+26: return "TB_SAVERESTOREA";
+        case WM_USER+76: return "TB_SAVERESTOREW";
+        case WM_USER+27: return "TB_CUSTOMIZE";
+        case WM_USER+28: return "TB_ADDSTRINGA";
+        case WM_USER+77: return "TB_ADDSTRINGW";
+        case WM_USER+29: return "TB_GETITEMRECT";
+        case WM_USER+30: return "TB_BUTTONSTRUCTSIZE";
+        case WM_USER+31: return "TB_SETBUTTONSIZE";
+        case WM_USER+32: return "TB_SETBITMAPSIZE";
+        case WM_USER+33: return "TB_AUTOSIZE";
+        case WM_USER+35: return "TB_GETTOOLTIPS";
+        case WM_USER+36: return "TB_SETTOOLTIPS";
+        case WM_USER+37: return "TB_SETPARENT";
+        case WM_USER+39: return "TB_SETROWS";
+        case WM_USER+40: return "TB_GETROWS";
+        case WM_USER+42: return "TB_SETCMDID";
+        case WM_USER+43: return "TB_CHANGEBITMAP";
+        case WM_USER+44: return "TB_GETBITMAP";
+        case WM_USER+45: return "TB_GETBUTTONTEXTA";
+        case WM_USER+75: return "TB_GETBUTTONTEXTW";
+        case WM_USER+46: return "TB_REPLACEBITMAP";
+        case WM_USER+47: return "TB_SETINDENT";
+        case WM_USER+48: return "TB_SETIMAGELIST";
+        case WM_USER+49: return "TB_GETIMAGELIST";
+        case WM_USER+50: return "TB_LOADIMAGES";
+        case WM_USER+51: return "TB_GETRECT";
+        case WM_USER+52: return "TB_SETHOTIMAGELIST";
+        case WM_USER+53: return "TB_GETHOTIMAGELIST";
+        case WM_USER+54: return "TB_SETDISABLEDIMAGELIST";
+        case WM_USER+55: return "TB_GETDISABLEDIMAGELIST";
+        case WM_USER+56: return "TB_SETSTYLE";
+        case WM_USER+57: return "TB_GETSTYLE";
+        case WM_USER+58: return "TB_GETBUTTONSIZE";
+        case WM_USER+59: return "TB_SETBUTTONWIDTH";
+        case WM_USER+60: return "TB_SETMAXTEXTROWS";
+        case WM_USER+61: return "TB_GETTEXTROWS";
+        case WM_USER+41: return "TB_GETBITMAPFLAGS";
+
+#endif //WIN32
+
+        default:
+            static char s_szBuf[128];
+            sprintf(s_szBuf, "<unknown message = %d>", message);
+            return s_szBuf;
     }
-
-    // 5) If this isn't a Win95 app, and we are using CTL3D, remove border
-    // effects from extended style
-#if wxUSE_CTL3D
-    if ( *want3D )
-        nativeBorder = FALSE;
-#endif
-
-    DWORD exStyle = MakeExtendedStyle(m_windowStyle, !nativeBorder);
-
-    // If we want 3D, but haven't specified a border here,
-    // apply the default border style specified.
-    // TODO what about non-Win95 WIN32? Does it have borders?
-#if defined(__WIN95__) && !wxUSE_CTL3D
-    if ( defaultBorderStyle && (*want3D) && ! ((m_windowStyle & wxDOUBLE_BORDER) || (m_windowStyle & wxRAISED_BORDER ) ||
-        (m_windowStyle & wxSTATIC_BORDER) || (m_windowStyle & wxSIMPLE_BORDER) ))
-        exStyle |= defaultBorderStyle; // WS_EX_CLIENTEDGE;
-#endif
 */
-    return exStyle;
+   return NULL;
 }