]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/radiobox.cpp
Fixed home and end accelerators.
[wxWidgets.git] / src / os2 / radiobox.cpp
index 3e52e2a3a2cabeac60baa62587c71a860cc629c4..d2ef991a12cf478c0f4f28dbdb6fce839de05308 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        radiobox.cpp
+// Name:        src/os2/radiobox.cpp
 // Purpose:     wxRadioBox
 // Author:      David Webster
 // Modified by:
 // Purpose:     wxRadioBox
 // Author:      David Webster
 // Modified by:
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#if wxUSE_RADIOBOX
+
 #ifndef WX_PRECOMP
     #include <stdio.h>
 #ifndef WX_PRECOMP
     #include <stdio.h>
-    #include "wx/setup.h"
     #include "wx/wxchar.h"
     #include "wx/string.h"
     #include "wx/bitmap.h"
     #include "wx/wxchar.h"
     #include "wx/string.h"
     #include "wx/bitmap.h"
@@ -46,10 +47,11 @@ MRESULT EXPENTRY wxRadioBoxWndProc( HWND   hWnd
 // global vars
 // ---------------------------------------------------------------------------
 
 // global vars
 // ---------------------------------------------------------------------------
 
-// the pointer to standard radio button wnd proc
 extern void  wxAssociateWinWithHandle( HWND         hWnd
                                       ,wxWindowOS2* pWin
                                      );
 extern void  wxAssociateWinWithHandle( HWND         hWnd
                                       ,wxWindowOS2* pWin
                                      );
+extern void wxRemoveHandleAssociation( wxWindowOS2 *pWin );
+// the pointer to standard radio button & box wnd procs
 static WXFARPROC                    fnWndProcRadioBtn = NULL;
 static WXFARPROC                    fnWndProcRadioBox = NULL;
 
 static WXFARPROC                    fnWndProcRadioBtn = NULL;
 static WXFARPROC                    fnWndProcRadioBox = NULL;
 
@@ -66,9 +68,7 @@ wxRadioBox::wxRadioBox()
 {
     m_nSelectedButton = -1;
     m_nNoItems = 0;
 {
     m_nSelectedButton = -1;
     m_nNoItems = 0;
-    m_nNoRowsOrCols = 0;
     m_ahRadioButtons = NULL;
     m_ahRadioButtons = NULL;
-    m_nMajorDim = 0;
     m_pnRadioWidth = NULL;
     m_pnRadioHeight = NULL;
 } // end of wxRadioBox::wxRadioBox
     m_pnRadioWidth = NULL;
     m_pnRadioHeight = NULL;
 } // end of wxRadioBox::wxRadioBox
@@ -77,11 +77,17 @@ wxRadioBox::~wxRadioBox()
 {
     m_isBeingDeleted = true;
 
 {
     m_isBeingDeleted = true;
 
+    if (m_hWnd)
+        wxRemoveHandleAssociation(this);
     if (m_ahRadioButtons)
     {
     if (m_ahRadioButtons)
     {
-        int                         i;
-        for (i = 0; i < m_nNoItems; i++)
+        for (size_t i = 0; i < m_nNoItems; i++)
+        {
+            wxWindow* pWin = wxFindWinFromHandle((WXHWND)m_ahRadioButtons[i]);
+            wxRemoveHandleAssociation(pWin);
+
             ::WinDestroyWindow((HWND)m_ahRadioButtons[i]);
             ::WinDestroyWindow((HWND)m_ahRadioButtons[i]);
+    }
         delete[] m_ahRadioButtons;
     }
     if (m_pnRadioWidth)
         delete[] m_ahRadioButtons;
     }
     if (m_pnRadioWidth)
@@ -90,159 +96,16 @@ wxRadioBox::~wxRadioBox()
         delete[] m_pnRadioHeight;
 } // end of wxRadioBox::~wxRadioBox
 
         delete[] m_pnRadioHeight;
 } // end of wxRadioBox::~wxRadioBox
 
-void wxRadioBox::AdjustButtons(
-  int                               nX
-, int                               nY
-, int                               nWidth
-, int                               nHeight
-, int                               nSizeFlags
-)
-{
-    wxSize                          vMaxSize;
-    int                             nXOffset = nX;
-    int                             nYOffset = nY + nHeight;
-    int                             nCx1;
-    int                             nCy1;
-    int                             nStartX;
-    int                             nStartY;
-    int                             nMaxWidth;
-    int                             nMaxHeight;
-    wxFont                          vFont = GetFont();
-
-    wxGetCharSize( m_hWnd
-                  ,&nCx1
-                  ,&nCy1
-                  ,&vFont
-                 );
-    vMaxSize   = GetMaxButtonSize();
-    nMaxWidth  = vMaxSize.x;
-    nMaxHeight = vMaxSize.y;
-
-    nXOffset += nCx1;
-    nYOffset -= (nMaxHeight + ((3*nCy1)/2));
-
-    nStartX = nXOffset;
-    nStartY = nYOffset;
-
-    for (int i = 0; i < m_nNoItems; i++)
-    {
-        //
-        // The last button in the row may be wider than the other ones as the
-        // radiobox may be wider than the sum of the button widths (as it
-        // happens, for example, when the radiobox label is very long)
-        //
-        bool                        bIsLastInTheRow;
-
-        if (m_windowStyle & wxRA_SPECIFY_COLS)
-        {
-            //
-            // Item is the last in its row if it is a multiple of the number of
-            // columns or if it is just the last item
-            //
-            int                     n = i + 1;
-
-            bIsLastInTheRow = ((n % m_nMajorDim) == 0) || (n == m_nNoItems);
-        }
-        else // winRA_SPECIFY_ROWS
-        {
-            //
-            // Item is the last in the row if it is in the last columns
-            //
-            bIsLastInTheRow = i >= (m_nNoItems/m_nMajorDim) * m_nMajorDim;
-        }
-
-        //
-        // Is this the start of new row/column?
-        //
-        if (i && (i % m_nMajorDim == 0))
-        {
-            if (m_windowStyle & wxRA_SPECIFY_ROWS)
-            {
-
-                //
-                // Start of new column
-                //
-                nYOffset = nStartY;
-                nXOffset += nMaxWidth + nCx1;
-            }
-            else // start of new row
-            {
-                nXOffset = nStartX;
-                nYOffset -= nMaxHeight;
-                if (m_pnRadioWidth[0] > 0L)
-                    nYOffset -= nCy1/2;
-            }
-        }
-
-        int                         nWidthBtn;
-
-        if (bIsLastInTheRow)
-        {
-            //
-            // Make the button go to the end of radio box
-            //
-            nWidthBtn = nStartX + nWidth - nXOffset - (2 * nCx1);
-            if (nWidthBtn < nMaxWidth)
-                nWidthBtn = nMaxWidth;
-        }
-        else
-        {
-            //
-            // Normal button, always of the same size
-            //
-            nWidthBtn = nMaxWidth;
-        }
-
-        //
-        // Make all buttons of the same, maximal size - like this they
-        // cover the radiobox entirely and the radiobox tooltips are always
-        // shown (otherwise they are not when the mouse pointer is in the
-        // radiobox part not beYInt32ing to any radiobutton)
-        //
-        ::WinSetWindowPos( (HWND)m_ahRadioButtons[i]
-                          ,HWND_TOP
-                          ,(LONG)nXOffset
-                          ,(LONG)nYOffset
-                          ,(LONG)nWidthBtn
-                          ,(LONG)nMaxHeight
-                          ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
-                         );
-        //
-        // Where do we put the next button?
-        //
-        if (m_windowStyle & wxRA_SPECIFY_ROWS)
-        {
-            //
-            // Below this one
-            //
-            nYOffset -= nMaxHeight;
-            if (m_pnRadioWidth[0] > 0)
-                nYOffset -= nCy1/2;
-        }
-        else
-        {
-            //
-            // To the right of this one
-            //
-            nXOffset += nWidthBtn + nCx1;
-        }
-    }
-} // end of wxRadioBox::AdjustButtons
-
-void wxRadioBox::Command (
-  wxCommandEvent&                   rEvent
-)
+void wxRadioBox::Command ( wxCommandEvent& rEvent )
 {
     SetSelection (rEvent.GetInt());
     ProcessCommand(rEvent);
 } // end of wxRadioBox::Command
 
 {
     SetSelection (rEvent.GetInt());
     ProcessCommand(rEvent);
 } // end of wxRadioBox::Command
 
-bool wxRadioBox::ContainsHWND(
-  WXHWND                            hWnd
-) const
+bool wxRadioBox::ContainsHWND( WXHWND hWnd ) const
 {
 {
-    size_t                          nCount = GetCount();
-    size_t                          i;
+    size_t nCount = GetCount();
+    size_t i;
 
     for (i = 0; i < nCount; i++)
     {
 
     for (i = 0; i < nCount; i++)
     {
@@ -252,18 +115,16 @@ bool wxRadioBox::ContainsHWND(
     return false;
 } // end of wxRadioBox::ContainsHWND
 
     return false;
 } // end of wxRadioBox::ContainsHWND
 
-bool wxRadioBox::Create(
-  wxWindow*                         pParent
-, wxWindowID                        vId
-, const wxString&                   rsTitle
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, const wxArrayString&              asChoices
-, int                               nMajorDim
-, long                              lStyle
-, const wxValidator&                rVal
-, const wxString&                   rsName
-)
+bool wxRadioBox::Create( wxWindow* pParent,
+                         wxWindowID vId,
+                         const wxString& rsTitle,
+                         const wxPoint& rPos,
+                         const wxSize& rSize,
+                         const wxArrayString& asChoices,
+                         int nMajorDim,
+                         long lStyle,
+                         const wxValidator& rVal,
+                         const wxString& rsName )
 {
     wxCArrayString chs(asChoices);
 
 {
     wxCArrayString chs(asChoices);
 
@@ -271,31 +132,27 @@ bool wxRadioBox::Create(
                   chs.GetStrings(), nMajorDim, lStyle, rVal, rsName);
 }
 
                   chs.GetStrings(), nMajorDim, lStyle, rVal, rsName);
 }
 
-bool wxRadioBox::Create(
-  wxWindow*                         pParent
-, wxWindowID                        vId
-, const wxString&                   rsTitle
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, int                               nNum
-, const wxString                    asChoices[]
-, int                               nMajorDim
-, long                              lStyle
-, const wxValidator&                rVal
-, const wxString&                   rsName
-)
-{
-    wxColour                        vColour;
-    LONG                            lColor;
-
-    vColour.Set(wxString("BLACK"));
+bool wxRadioBox::Create( wxWindow* pParent,
+                         wxWindowID vId,
+                         const wxString& rsTitle,
+                         const wxPoint& rPos,
+                         const wxSize& rSize,
+                         int nNum,
+                         const wxString asChoices[],
+                         int nMajorDim,
+                         long lStyle,
+                         const wxValidator& rVal,
+                         const wxString& rsName )
+{
+    wxColour vColour;
+    LONG     lColor;
+    HWND     hWndParent = GetHwndOf(pParent);
+
+    vColour.Set(wxString(wxT("BLACK")));
     m_backgroundColour = pParent->GetBackgroundColour();
     m_nSelectedButton = -1;
     m_nNoItems = 0;
 
     m_backgroundColour = pParent->GetBackgroundColour();
     m_nSelectedButton = -1;
     m_nNoItems = 0;
 
-    m_nMajorDim     = nMajorDim == 0 ? nNum : nMajorDim;
-    m_nNoRowsOrCols = nMajorDim;
-
     //
     // Common initialization
     //
     //
     // Common initialization
     //
@@ -308,7 +165,7 @@ bool wxRadioBox::Create(
                        ,rsName
                       ))
         return false;
                        ,rsName
                       ))
         return false;
-    if (!OS2CreateControl( "STATIC"
+    if (!OS2CreateControl( wxT("STATIC")
                           ,SS_GROUPBOX
                           ,rPos
                           ,rSize
                           ,SS_GROUPBOX
                           ,rPos
                           ,rSize
@@ -319,10 +176,11 @@ bool wxRadioBox::Create(
     wxAssociateWinWithHandle(m_hWnd, this);
 
     //
     wxAssociateWinWithHandle(m_hWnd, this);
 
     //
-    // Some radio boxes test consecutive id.
+    // Now we can set m_nNoItems and let SetMajorDim set m_numCols/m_numRows
     //
     //
-    m_nNoItems = nNum;
-    (void)NewControlId();
+    m_nNoItems = (size_t)nNum;
+    SetMajorDim(nMajorDim == 0 ? nNum : nMajorDim, lStyle);
+
     m_ahRadioButtons = new WXHWND[nNum];
     m_pnRadioWidth   = new int[nNum];
     m_pnRadioHeight  = new int[nNum];
     m_ahRadioButtons = new WXHWND[nNum];
     m_pnRadioWidth   = new int[nNum];
     m_pnRadioHeight  = new int[nNum];
@@ -330,41 +188,42 @@ bool wxRadioBox::Create(
     for (int i = 0; i < nNum; i++)
     {
         m_pnRadioWidth[i] = m_pnRadioHeight[i] = -1;
     for (int i = 0; i < nNum; i++)
     {
         m_pnRadioWidth[i] = m_pnRadioHeight[i] = -1;
-
-        long                        lStyleBtn = BS_AUTORADIOBUTTON | WS_TABSTOP | WS_VISIBLE;
+        long                        lStyleBtn = BS_AUTORADIOBUTTON | WS_VISIBLE;
         int                         nNewId = NewControlId();
 
         int                         nNewId = NewControlId();
 
-        if (i == 0 && lStyle == 0)
-            lStyleBtn |= WS_GROUP;
-
-        HWND                        hWndBtn = (WXHWND)::WinCreateWindow ( GetHwndOf(pParent)
-                                                                         ,WC_BUTTON
-                                                                         ,asChoices[i]
-                                                                         ,lStyleBtn
-                                                                         ,0, 0, 0, 0
-                                                                         ,GetWinHwnd(pParent)
-                                                                         ,HWND_TOP
-                                                                         ,(HMENU)nNewId
-                                                                         ,NULL
-                                                                         ,NULL
+        if (i == 0)
+            lStyleBtn |= WS_GROUP | WS_TABSTOP;
+
+        wxString                    sLabel = ::wxPMTextToLabel(asChoices[i]);
+
+        HWND                        hWndBtn = (WXHWND)::WinCreateWindow ( hWndParent,
+                                                                          WC_BUTTON,
+                                                                          sLabel.c_str(),
+                                                                          lStyleBtn,
+                                                                          0, 0, 0, 0,
+                                                                          hWndParent,
+                                                                          HWND_BOTTOM,
+                                                                          (HMENU)nNewId,
+                                                                          NULL,
+                                                                          NULL
                                                                         );
                                                                         );
+        if (!hWndBtn)
+        {
+            return false;
+        }
         lColor = (LONG)vColour.GetPixel();
         ::WinSetPresParam( hWndBtn
                           ,PP_FOREGROUNDCOLOR
                           ,sizeof(LONG)
                           ,(PVOID)&lColor
                          );
         lColor = (LONG)vColour.GetPixel();
         ::WinSetPresParam( hWndBtn
                           ,PP_FOREGROUNDCOLOR
                           ,sizeof(LONG)
                           ,(PVOID)&lColor
                          );
-        lColor = (LONG)m_backgroundColour.GetPixel();
 
 
+        lColor = (LONG)m_backgroundColour.GetPixel();
         ::WinSetPresParam( hWndBtn
                           ,PP_BACKGROUNDCOLOR
                           ,sizeof(LONG)
                           ,(PVOID)&lColor
                          );
         ::WinSetPresParam( hWndBtn
                           ,PP_BACKGROUNDCOLOR
                           ,sizeof(LONG)
                           ,(PVOID)&lColor
                          );
-        if (!hWndBtn)
-        {
-            return false;
-        }
         m_ahRadioButtons[i] = (WXHWND)hWndBtn;
         SubclassRadioButton((WXHWND)hWndBtn);
         wxAssociateWinWithHandle(hWndBtn, this);
         m_ahRadioButtons[i] = (WXHWND)hWndBtn;
         SubclassRadioButton((WXHWND)hWndBtn);
         wxAssociateWinWithHandle(hWndBtn, this);
@@ -376,20 +235,19 @@ bool wxRadioBox::Create(
     }
 
     //
     }
 
     //
-    // Create a dummy radio control to end the group.
+    // Create a dummy control to end the group.
     //
     //
-    (void)::WinCreateWindow ( GetHwndOf(pParent)
-                             ,WC_BUTTON
-                             ,""
-                             ,WS_GROUP | BS_AUTORADIOBUTTON
-                             ,0, 0, 0, 0
-                             ,GetWinHwnd(pParent)
-                             ,HWND_TOP
-                             ,(HMENU)NewControlId()
-                             ,NULL
-                             ,NULL
+    (void)::WinCreateWindow ( hWndParent,
+                              WC_BUTTON,
+                              "",
+                              WS_GROUP,
+                              0, 0, 0, 0,
+                              hWndParent,
+                              HWND_TOP,
+                              (HMENU)NewControlId(),
+                              NULL,
+                              NULL
                             );
                             );
-    SetFont(*wxSMALL_FONT);
     fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd()
                                                        ,(PFNWP)wxRadioBoxWndProc
                                                       );
     fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd()
                                                        ,(PFNWP)wxRadioBoxWndProc
                                                       );
@@ -400,23 +258,13 @@ bool wxRadioBox::Create(
                       ,sizeof(LONG)
                       ,(PVOID)&lColor
                      );
                       ,sizeof(LONG)
                       ,(PVOID)&lColor
                      );
-    ::WinSetPresParam( m_hWnd
-                      ,PP_BORDERDARKCOLOR
-                      ,sizeof(LONG)
-                      ,(PVOID)&lColor
-                     );
-    lColor = (LONG)m_backgroundColour.GetPixel();
 
 
+    lColor = (LONG)m_backgroundColour.GetPixel();
     ::WinSetPresParam( m_hWnd
                       ,PP_BACKGROUNDCOLOR
                       ,sizeof(LONG)
                       ,(PVOID)&lColor
                      );
     ::WinSetPresParam( m_hWnd
                       ,PP_BACKGROUNDCOLOR
                       ,sizeof(LONG)
                       ,(PVOID)&lColor
                      );
-    ::WinSetPresParam( m_hWnd
-                      ,PP_BORDERLIGHTCOLOR
-                      ,sizeof(LONG)
-                      ,(PVOID)&lColor
-                     );
     SetXComp(0);
     SetYComp(0);
     SetSelection(0);
     SetXComp(0);
     SetYComp(0);
     SetSelection(0);
@@ -431,7 +279,7 @@ bool wxRadioBox::Create(
 wxSize wxRadioBox::DoGetBestSize() const
 {
     return (GetTotalButtonSize(GetMaxButtonSize()));
 wxSize wxRadioBox::DoGetBestSize() const
 {
     return (GetTotalButtonSize(GetMaxButtonSize()));
-} // end of WinGuiBase_CRadioBox::DoGetBestSize
+} // end of wxRadioBox::DoGetBestSize
 
 void wxRadioBox::DoSetSize(
   int                               nX
 
 void wxRadioBox::DoSetSize(
   int                               nX
@@ -441,19 +289,17 @@ void wxRadioBox::DoSetSize(
 , int                               nSizeFlags
 )
 {
 , int                               nSizeFlags
 )
 {
+    //
+    // Input parameters assume wxWidgets coordinate system
+    //
     int                             nCurrentX;
     int                             nCurrentY;
     int                             nWidthOld;
     int                             nHeightOld;
     int                             nXx = nX;
     int                             nYy = nY;
     int                             nCurrentX;
     int                             nCurrentY;
     int                             nWidthOld;
     int                             nHeightOld;
     int                             nXx = nX;
     int                             nYy = nY;
-#if RADIOBTN_PARENT_IS_RADIOBOX
-    int                             nXOffset = 0;
-    int                             nYOffset = 0;
-#else
     int                             nXOffset = nXx;
     int                             nYOffset = nYy;
     int                             nXOffset = nXx;
     int                             nYOffset = nYy;
-#endif
     int                             nCx1;
     int                             nCy1;
     wxSize                          vMaxSize = GetMaxButtonSize();
     int                             nCx1;
     int                             nCy1;
     wxSize                          vMaxSize = GetMaxButtonSize();
@@ -474,9 +320,9 @@ void wxRadioBox::DoSetSize(
             ,&nHeightOld
            );
 
             ,&nHeightOld
            );
 
-    if (nX == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (nX == wxDefaultCoord && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         nXx = nCurrentX;
         nXx = nCurrentX;
-    if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+    if (nY == wxDefaultCoord && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         nYy = nCurrentY;
     if (nYy < 0)
         nYy = 0;
         nYy = nCurrentY;
     if (nYy < 0)
         nYy = 0;
@@ -520,22 +366,19 @@ void wxRadioBox::DoSetSize(
             nHeight = nHeightOld;
     }
 
             nHeight = nHeightOld;
     }
 
+    //
+    // Now convert to OS/2 coordinate system
+    //
     wxWindowOS2*                    pParent = (wxWindowOS2*)GetParent();
     wxWindowOS2*                    pParent = (wxWindowOS2*)GetParent();
-
     if (pParent)
     if (pParent)
-    {
-        int                         nOS2Height = GetOS2ParentHeight(pParent);
-
-        nYy = nOS2Height - (nYy + nHeight);
-        nYOffset = nYy + nHeight;
-    }
+        nYy = GetOS2ParentHeight(pParent) - nYy - nHeight;
     else
     {
         RECTL                       vRect;
     else
     {
         RECTL                       vRect;
-
         ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
         ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
-        nYy = vRect.yTop - (nYy + nHeight);
+        nYy = vRect.yTop - nYy - nHeight;
     }
     }
+    nYOffset = nYy + nHeight;
     ::WinSetWindowPos( GetHwnd()
                       ,HWND_TOP
                       ,(LONG)nXx
     ::WinSetWindowPos( GetHwnd()
                       ,HWND_TOP
                       ,(LONG)nXx
@@ -563,14 +406,14 @@ void wxRadioBox::DoSetSize(
     nStartX = nXOffset;
     nStartY = nYOffset;
 
     nStartX = nXOffset;
     nStartY = nYOffset;
 
-    for (int i = 0; i < m_nNoItems; i++)
+    for (size_t i = 0; i < m_nNoItems; i++)
     {
         //
         // The last button in the row may be wider than the other ones as the
         // radiobox may be wider than the sum of the button widths (as it
         // happens, for example, when the radiobox label is very long)
         //
     {
         //
         // The last button in the row may be wider than the other ones as the
         // radiobox may be wider than the sum of the button widths (as it
         // happens, for example, when the radiobox label is very long)
         //
-        bool                        bIsLastInTheRow;
+        bool bIsLastInTheRow;
 
         if (m_windowStyle & wxRA_SPECIFY_COLS)
         {
 
         if (m_windowStyle & wxRA_SPECIFY_COLS)
         {
@@ -580,24 +423,23 @@ void wxRadioBox::DoSetSize(
             //
             int                  n = i + 1;
 
             //
             int                  n = i + 1;
 
-            bIsLastInTheRow = ((n % m_nMajorDim) == 0) || (n == m_nNoItems);
+            bIsLastInTheRow = ((n % GetMajorDim()) == 0) || (n == (int)m_nNoItems);
         }
         else // winRA_SPECIFY_ROWS
         {
             //
             // Item is the last in the row if it is in the last columns
             //
         }
         else // winRA_SPECIFY_ROWS
         {
             //
             // Item is the last in the row if it is in the last columns
             //
-            bIsLastInTheRow = i >= (m_nNoItems/m_nMajorDim) * m_nMajorDim;
+            bIsLastInTheRow = i >= (m_nNoItems/GetMajorDim()) * GetMajorDim();
         }
 
         //
         // Is this the start of new row/column?
         //
         }
 
         //
         // Is this the start of new row/column?
         //
-        if (i && (i % m_nMajorDim == 0))
+        if (i && (i % GetMajorDim() == 0))
         {
             if (m_windowStyle & wxRA_SPECIFY_ROWS)
             {
         {
             if (m_windowStyle & wxRA_SPECIFY_ROWS)
             {
-
                 //
                 // Start of new column
                 //
                 //
                 // Start of new column
                 //
@@ -636,17 +478,16 @@ void wxRadioBox::DoSetSize(
         // Make all buttons of the same, maximal size - like this they
         // cover the radiobox entirely and the radiobox tooltips are always
         // shown (otherwise they are not when the mouse pointer is in the
         // Make all buttons of the same, maximal size - like this they
         // cover the radiobox entirely and the radiobox tooltips are always
         // shown (otherwise they are not when the mouse pointer is in the
-        // radiobox part not beinting to any radiobutton)
+        // radiobox part not belonging to any radiobutton)
         //
         ::WinSetWindowPos( (HWND)m_ahRadioButtons[i]
         //
         ::WinSetWindowPos( (HWND)m_ahRadioButtons[i]
-                          ,HWND_TOP
+                          ,HWND_BOTTOM
                           ,(LONG)nXOffset
                           ,(LONG)nYOffset
                           ,(LONG)nWidthBtn
                           ,(LONG)nMaxHeight
                           ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
                          );
                           ,(LONG)nXOffset
                           ,(LONG)nYOffset
                           ,(LONG)nWidthBtn
                           ,(LONG)nMaxHeight
                           ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
                          );
-        GetParent()->Refresh();
         //
         // Where do we put the next button?
         //
         //
         // Where do we put the next button?
         //
@@ -671,64 +512,43 @@ void wxRadioBox::DoSetSize(
 
 bool wxRadioBox::Enable(int nItem, bool bEnable)
 {
 
 bool wxRadioBox::Enable(int nItem, bool bEnable)
 {
-    wxCHECK_MSG( nItem >= 0 && nItem < m_nNoItems, false,
+    wxCHECK_MSG( IsValid(nItem), false,
                  wxT("invalid item in wxRadioBox::Enable()") );
 
     ::WinEnableWindow((HWND) m_ahRadioButtons[nItem], bEnable);
     return true;
 } // end of wxRadioBox::Enable
 
                  wxT("invalid item in wxRadioBox::Enable()") );
 
     ::WinEnableWindow((HWND) m_ahRadioButtons[nItem], bEnable);
     return true;
 } // end of wxRadioBox::Enable
 
-bool wxRadioBox::Enable(
-  bool                              bEnable
-)
+bool wxRadioBox::Enable(bool bEnable)
 {
     if ( !wxControl::Enable(bEnable) )
         return false;
 {
     if ( !wxControl::Enable(bEnable) )
         return false;
-    for (int i = 0; i < m_nNoItems; i++)
+    for (size_t i = 0; i < m_nNoItems; i++)
         ::WinEnableWindow((HWND)m_ahRadioButtons[i], bEnable);
     return true;
 } // end of wxRadioBox::Enable
 
         ::WinEnableWindow((HWND)m_ahRadioButtons[i], bEnable);
     return true;
 } // end of wxRadioBox::Enable
 
-int wxRadioBox::FindString(
-  const wxString&                   rsStr
-) const
-{
-    for (int i = 0; i < m_nNoItems; i++)
-    {
-        if (rsStr == wxGetWindowText(m_ahRadioButtons[i]) )
-            return i;
-    }
-    return wxNOT_FOUND;
-} // end of wxRadioBox::FindString
-
-int wxRadioBox::GetColumnCount() const
-{
-    return GetNumHor();
-} // end of wxRadioBox::GetColumnCount
-
-int wxRadioBox::GetCount() const
+size_t wxRadioBox::GetCount() const
 {
     return m_nNoItems;
 } // end of wxRadioBox::GetCount
 
 {
     return m_nNoItems;
 } // end of wxRadioBox::GetCount
 
-wxString wxRadioBox::GetLabel(
-  int                               nItem
-) const
+wxString wxRadioBox::GetLabel(int nItem) const
 {
 {
-    wxCHECK_MSG(nItem >= 0 && nItem < m_nNoItems, wxEmptyString, wxT("invalid radiobox index") );
+    wxCHECK_MSG( IsValid(nItem), wxEmptyString, wxT("invalid radiobox index") );
 
     return wxGetWindowText(m_ahRadioButtons[nItem]);
 } // end of wxRadioBox::GetLabel
 
 wxSize wxRadioBox::GetMaxButtonSize() const
 {
 
     return wxGetWindowText(m_ahRadioButtons[nItem]);
 } // end of wxRadioBox::GetLabel
 
 wxSize wxRadioBox::GetMaxButtonSize() const
 {
-    int                             nWidthMax = 0;
-    int                             nHeightMax = 0;
+    int nWidthMax = 0;
+    int nHeightMax = 0;
 
 
-    for (int i = 0 ; i < m_nNoItems; i++)
+    for (size_t i = 0 ; i < m_nNoItems; i++)
     {
     {
-        int                         nWidth;
-        int                         nHeight;
+        int nWidth;
+        int nHeight;
 
         if (m_pnRadioWidth[i] < 0L)
         {
 
         if (m_pnRadioWidth[i] < 0L)
         {
@@ -755,103 +575,19 @@ wxSize wxRadioBox::GetMaxButtonSize() const
         if (nHeightMax < nHeight )
             nHeightMax = nHeight;
     }
         if (nHeightMax < nHeight )
             nHeightMax = nHeight;
     }
-    return(wxSize( nWidthMax
-                  ,nHeightMax
-                 )
-          );
+    wxSize maxsize( nWidthMax, nHeightMax);
+    return maxsize;
 } // end of wxRadioBox::GetMaxButtonSize
 
 } // end of wxRadioBox::GetMaxButtonSize
 
-int wxRadioBox::GetNumHor() const
-{
-    if ( m_windowStyle & wxRA_SPECIFY_ROWS )
-    {
-        return (m_nNoItems + m_nMajorDim - 1)/m_nMajorDim;
-    }
-    else
-    {
-        return m_nMajorDim;
-    }
-} // end of wxRadioBox::GetNumHor
-
-int wxRadioBox::GetNumVer() const
-{
-    if ( m_windowStyle & wxRA_SPECIFY_ROWS )
-    {
-        return m_nMajorDim;
-    }
-    else
-    {
-        return (m_nNoItems + m_nMajorDim - 1)/m_nMajorDim;
-    }
-} // end of wxRadioBox::GetNumVer
-
-void wxRadioBox::GetPosition(
-  int*                              pnX
-, int*                              pnY
-) const
-{
-    wxWindowOS2*                    pParent = GetParent();
-    RECT                            vRect = { -1, -1, -1, -1 };;
-    POINTL                          vPoint;
-    int                             i;
-
-    for (i = 0; i < m_nNoItems; i++)
-        wxFindMaxSize( m_ahRadioButtons[i]
-                      ,&vRect
-                     );
-    if (m_hWnd)
-        wxFindMaxSize( m_hWnd
-                      ,&vRect
-                     );
-
-    //
-    // Since we now have the absolute screen coords, if there's a parent we
-    // must subtract its top left corner
-    //
-    vPoint.x = vRect.xLeft;
-    vPoint.y = vRect.yTop;
-    if (pParent)
-    {
-        SWP                             vSwp;
-
-        ::WinQueryWindowPos((HWND)pParent->GetHWND(), &vSwp);
-        vPoint.x = vSwp.x;
-        vPoint.y = vSwp.y;
-    }
-
-    //
-    // 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                     vPt(GetParent()->GetClientAreaOrigin());
-
-        vPoint.x = vPt.x;
-        vPoint.y = vPt.y;
-    }
-    *pnX = vPoint.x;
-    *pnX = vPoint.y;
-} // end of wxRadioBox::GetPosition
-
-int wxRadioBox::GetRowCount() const
-{
-    return GetNumVer();
-} // end of wxRadioBox::GetRowCount
-
 // Get single selection, for single choice list items
 int wxRadioBox::GetSelection() const
 {
     return m_nSelectedButton;
 } // end of wxRadioBox::GetSelection
 
 // Get single selection, for single choice list items
 int wxRadioBox::GetSelection() const
 {
     return m_nSelectedButton;
 } // end of wxRadioBox::GetSelection
 
-void wxRadioBox::GetSize(
-  int*                              pnWidth
-, int*                              pnHeight
-) const
+void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const
 {
 {
-    RECT                            vRect;
-    int                             i;
+    RECT vRect;
 
     vRect.xLeft   = -1;
     vRect.xRight  = -1;
 
     vRect.xLeft   = -1;
     vRect.xRight  = -1;
@@ -859,14 +595,10 @@ void wxRadioBox::GetSize(
     vRect.yBottom = -1;
 
     if (m_hWnd)
     vRect.yBottom = -1;
 
     if (m_hWnd)
-        wxFindMaxSize( m_hWnd
-                      ,&vRect
-                     );
+        wxFindMaxSize( m_hWnd, &vRect );
 
 
-    for (i = 0; i < m_nNoItems; i++)
-        wxFindMaxSize( m_ahRadioButtons[i]
-                      ,&vRect
-                     );
+    for (size_t i = 0; i < m_nNoItems; i++)
+        wxFindMaxSize( m_ahRadioButtons[i], &vRect );
 
     if (pnWidth)
         *pnWidth  = vRect.xRight - vRect.xLeft;
 
     if (pnWidth)
         *pnWidth  = vRect.xRight - vRect.xLeft;
@@ -875,10 +607,9 @@ void wxRadioBox::GetSize(
 } // end of wxRadioBox::GetSize
 
 // Find string for position
 } // end of wxRadioBox::GetSize
 
 // Find string for position
-wxString wxRadioBox::GetString(
-  int                               nNum
-) const
+wxString wxRadioBox::GetString( int nNum ) const
 {
 {
+    wxCHECK_MSG( IsValid(nNum), wxEmptyString, wxT("invalid radiobox index") );
     return wxGetWindowText(m_ahRadioButtons[nNum]);
 } // end of wxRadioBox::GetString
 
     return wxGetWindowText(m_ahRadioButtons[nNum]);
 } // end of wxRadioBox::GetString
 
@@ -893,87 +624,72 @@ wxString wxRadioBox::GetStringSelection() const
     return sResult;
 } // end of wxRadioBox::GetStringSelection
 
     return sResult;
 } // end of wxRadioBox::GetStringSelection
 
-wxSize wxRadioBox::GetTotalButtonSize(
-  const wxSize&                     rSizeBtn
-) const
+wxSize wxRadioBox::GetTotalButtonSize( const wxSize& rSizeBtn ) const
 {
 {
-    int                             nCx1;
-    int                             nCy1;
-    int                             nExtraHeight;
-    int                             nHeight;
-    int                             nWidth;
-    int                             nWidthLabel;
-    wxFont                          vFont = GetFont();
-
-    wxGetCharSize( m_hWnd
-                  ,&nCx1
-                  ,&nCy1
-                  ,&vFont
-                 );
-    nExtraHeight = nCy1;
+    int    nCx1;
+    int    nCy1;
+    int    nHeight;
+    int    nWidth;
+    int    nWidthLabel = 0;
 
 
-    nHeight = GetNumVer() * rSizeBtn.y + (2 * nCy1);
-    nWidth  = GetNumHor() * (rSizeBtn.x + nCx1) + nCx1;
+    nCx1 = GetCharWidth();
+    nCy1 = GetCharHeight();
+    nHeight = GetRowCount() * rSizeBtn.y + (2 * nCy1);
+    nWidth  = GetColumnCount() * (rSizeBtn.x + nCx1) + nCx1;
 
     //
     // And also wide enough for its label
     //
 
     //
     // And also wide enough for its label
     //
-    GetTextExtent( GetTitle()
-                  ,&nWidthLabel
-                  ,NULL
-                 );
-    nWidthLabel += RADIO_SIZE;
+    wxString sStr = wxGetWindowText(GetHwnd());
+    if (!sStr.empty())
+    {
+        GetTextExtent( sStr
+                      ,&nWidthLabel
+                      ,NULL
+                     );
+        nWidthLabel += 2*nCx1;
+    }
     if (nWidthLabel > nWidth)
         nWidth = nWidthLabel;
 
     if (nWidthLabel > nWidth)
         nWidth = nWidthLabel;
 
-    return(wxSize( nWidth
-                  ,nHeight
-                 )
-          );
+    wxSize total( nWidth, nHeight );
+    return total;
 } // end of wxRadioBox::GetTotalButtonSize
 
 } // end of wxRadioBox::GetTotalButtonSize
 
-WXHBRUSH wxRadioBox::OnCtlColor(
-  WXHDC                             hwinDC
-, WXHWND                            hWnd
-, WXUINT                            uCtlColor
-, WXUINT                            uMessage
-, WXWPARAM                          wParam
-, WXLPARAM                          lParam
-)
+WXHBRUSH wxRadioBox::OnCtlColor( WXHDC    hwinDC,
+                                 WXHWND   WXUNUSED(hWnd),
+                                 WXUINT   WXUNUSED(uCtlColor),
+                                 WXUINT   WXUNUSED(uMessage),
+                                 WXWPARAM WXUNUSED(wParam),
+                                 WXLPARAM WXUNUSED(lParam) )
 {
 {
-    HPS                             hPS = (HPS)hwinDC; // pass in a PS handle in OS/2
+    HPS hPS = (HPS)hwinDC; // pass in a PS handle in OS/2
 
     if (GetParent()->GetTransparentBackground())
         ::GpiSetBackMix(hPS, BM_LEAVEALONE);
     else
         ::GpiSetBackMix(hPS, BM_OVERPAINT);
 
 
     if (GetParent()->GetTransparentBackground())
         ::GpiSetBackMix(hPS, BM_LEAVEALONE);
     else
         ::GpiSetBackMix(hPS, BM_OVERPAINT);
 
-    wxColour                        vColBack = GetBackgroundColour();
+    wxColour vColBack = GetBackgroundColour();
 
     ::GpiSetBackColor(hPS, vColBack.GetPixel());
     ::GpiSetColor(hPS, vColBack.GetPixel());
 
 
     ::GpiSetBackColor(hPS, vColBack.GetPixel());
     ::GpiSetColor(hPS, vColBack.GetPixel());
 
-
-    wxBrush*                        pBrush = wxTheBrushList->FindOrCreateBrush( vColBack
-                                                                               ,wxSOLID
-                                                                              );
+    wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack, wxSOLID );
     return ((WXHBRUSH)pBrush->GetResourceHandle());
 } // end of wxRadioBox::OnCtlColor
 
     return ((WXHBRUSH)pBrush->GetResourceHandle());
 } // end of wxRadioBox::OnCtlColor
 
-bool wxRadioBox::OS2Command(
-  WXUINT                            uCmd
-, WXWORD                            wId
-)
+bool wxRadioBox::OS2Command( WXUINT uCmd,
+                             WXWORD wId)
 {
 {
-    int                             nSelectedButton = -1;
+    int nSelectedButton = -1;
 
     if (uCmd == BN_CLICKED)
     {
         if (wId == GetId())
             return true;
 
 
     if (uCmd == BN_CLICKED)
     {
         if (wId == GetId())
             return true;
 
-
-        for (int i = 0; i < m_nNoItems; i++)
+        for (size_t i = 0; i < m_nNoItems; i++)
         {
             if (wId == wxGetWindowId(m_ahRadioButtons[i]))
             {
         {
             if (wId == wxGetWindowId(m_ahRadioButtons[i]))
             {
@@ -1022,9 +738,7 @@ void wxRadioBox::SetFocus()
     }
 } // end of wxRadioBox::SetFocus
 
     }
 } // end of wxRadioBox::SetFocus
 
-bool wxRadioBox::SetFont(
-  const wxFont&                     rFont
-)
+bool wxRadioBox::SetFont(const wxFont& rFont)
 {
     if (!wxControl::SetFont(rFont))
     {
 {
     if (!wxControl::SetFont(rFont))
     {
@@ -1036,13 +750,11 @@ bool wxRadioBox::SetFont(
     //
     // Also set the font of our radio buttons
     //
     //
     // Also set the font of our radio buttons
     //
-    for (int n = 0; n < (int)m_nNoItems; n++)
+    for (size_t n = 0; n < m_nNoItems; n++)
     {
     {
-        HWND                        hWndBtn = (HWND)m_ahRadioButtons[n];
+        HWND hWndBtn = (HWND)m_ahRadioButtons[n];
 
 
-        wxOS2SetFont( hWndBtn
-                     ,rFont
-                    );
+        wxOS2SetFont( hWndBtn, rFont );
         ::WinInvalidateRect(hWndBtn, NULL, FALSE);
     }
     return true;
         ::WinInvalidateRect(hWndBtn, NULL, FALSE);
     }
     return true;
@@ -1052,9 +764,9 @@ void wxRadioBox::SetSelection(
   int                               nNum
 )
 {
   int                               nNum
 )
 {
-    wxCHECK_RET( (nNum >= 0) && (nNum < m_nNoItems), wxT("invalid radiobox index") );
+    wxCHECK_RET( IsValid(nNum), wxT("invalid radiobox index") );
 
 
-    if (m_nSelectedButton >= 0 && m_nSelectedButton < m_nNoItems)
+    if ( IsValid(m_nSelectedButton) )
         ::WinSendMsg((HWND)m_ahRadioButtons[m_nSelectedButton], BM_SETCHECK, (MPARAM)0, (MPARAM)0);
 
     ::WinSendMsg((HWND)m_ahRadioButtons[nNum], BM_SETCHECK, (MPARAM)1, (MPARAM)0);
         ::WinSendMsg((HWND)m_ahRadioButtons[m_nSelectedButton], BM_SETCHECK, (MPARAM)0, (MPARAM)0);
 
     ::WinSendMsg((HWND)m_ahRadioButtons[nNum], BM_SETCHECK, (MPARAM)1, (MPARAM)0);
@@ -1067,17 +779,15 @@ void wxRadioBox::SetString(
 , const wxString&                   rsLabel
 )
 {
 , const wxString&                   rsLabel
 )
 {
-    wxCHECK_RET( nItem >= 0 && nItem < m_nNoItems, wxT("invalid radiobox index") );
+    wxCHECK_RET( IsValid(nItem), wxT("invalid radiobox index") );
 
     m_pnRadioWidth[nItem] = m_pnRadioHeight[nItem] = -1;
 
     m_pnRadioWidth[nItem] = m_pnRadioHeight[nItem] = -1;
-    ::WinSetWindowText((HWND)m_ahRadioButtons[nItem], rsLabel.c_str());
+    ::WinSetWindowText((HWND)m_ahRadioButtons[nItem], (PSZ)rsLabel.c_str());
 } // end of wxRadioBox::SetString
 
 } // end of wxRadioBox::SetString
 
-bool wxRadioBox::SetStringSelection(
-  const wxString&                   rsStr
-)
+bool wxRadioBox::SetStringSelection(const wxString& rsStr)
 {
 {
-    int                             nSel = FindString(rsStr);
+    int nSel = FindString(rsStr);
 
     if (nSel > -1)
     {
 
     if (nSel > -1)
     {
@@ -1088,14 +798,12 @@ bool wxRadioBox::SetStringSelection(
         return false;
 } // end of wxRadioBox::SetStringSelection
 
         return false;
 } // end of wxRadioBox::SetStringSelection
 
-bool wxRadioBox::Show(
-  bool                              bShow
-)
+bool wxRadioBox::Show(bool bShow)
 {
     if (!wxControl::Show(bShow))
         return false;
 
 {
     if (!wxControl::Show(bShow))
         return false;
 
-    for (int i = 0; i < m_nNoItems; i++)
+    for (size_t i = 0; i < m_nNoItems; i++)
     {
         ::WinShowWindow((HWND)m_ahRadioButtons[i], (BOOL)bShow);
     }
     {
         ::WinShowWindow((HWND)m_ahRadioButtons[i], (BOOL)bShow);
     }
@@ -1103,15 +811,17 @@ bool wxRadioBox::Show(
 } // end of wxRadioBox::Show
 
 // Show a specific button
 } // end of wxRadioBox::Show
 
 // Show a specific button
-void wxRadioBox::Show(
+bool wxRadioBox::Show(
   int                               nItem
 , bool                              bShow
 )
 {
   int                               nItem
 , bool                              bShow
 )
 {
-    wxCHECK_RET( nItem >= 0 && nItem < m_nNoItems,
+    wxCHECK_MSG( IsValid(nItem), false,
                  wxT("invalid item in wxRadioBox::Show()") );
 
     ::WinShowWindow((HWND)m_ahRadioButtons[nItem], bShow);
                  wxT("invalid item in wxRadioBox::Show()") );
 
     ::WinShowWindow((HWND)m_ahRadioButtons[nItem], bShow);
+
+    return true;
 } // end of wxRadioBox::Show
 
 void wxRadioBox::SubclassRadioButton(
 } // end of wxRadioBox::Show
 
 void wxRadioBox::SubclassRadioButton(
@@ -1164,11 +874,11 @@ MRESULT wxRadioBtnWndProc(
                         switch(uVk)
                         {
                             case VK_LEFT:
                         switch(uVk)
                         {
                             case VK_LEFT:
-                                eDir = wxDOWN;
+                                eDir = wxLEFT;
                                 break;
 
                             case VK_RIGHT:
                                 break;
 
                             case VK_RIGHT:
-                                eDir = wxDOWN;
+                                eDir = wxRIGHT;
                                 break;
 
                             case VK_DOWN:
                                 break;
 
                             case VK_DOWN:
@@ -1220,18 +930,16 @@ MRESULT wxRadioBtnWndProc(
                             );
 } // end of wxRadioBtnWndProc
 
                             );
 } // end of wxRadioBtnWndProc
 
-MRESULT EXPENTRY wxRadioBoxWndProc(
-  HWND                              hWnd
-, UINT                              uMessage
-, MPARAM                            wParam
-, MPARAM                            lParam
-)
+MRESULT EXPENTRY wxRadioBoxWndProc( HWND hWnd,
+                                    UINT uMessage,
+                                    MPARAM wParam,
+                                    MPARAM lParam )
 {
 {
-    return (fnWndProcRadioBox( hWnd
-                              ,(ULONG)uMessage
-                              ,(MPARAM)wParam
-                              ,(MPARAM)lParam
-                             )
+    return (fnWndProcRadioBox( hWnd,
+                               (ULONG)uMessage,
+                               (MPARAM)wParam,
+                               (MPARAM)lParam )
            );
 } // end of wxRadioBoxWndProc
 
            );
 } // end of wxRadioBoxWndProc
 
+#endif // wxUSE_RADIOBOX