]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/radiobox.cpp
fixed event generation for wxChoice: it now sends one and exactly one wxEVT_COMMAND_C...
[wxWidgets.git] / src / os2 / radiobox.cpp
index 0893aa63b4e7437b08dc64104951ac4d5006ff61..fa60f8f8dee91ed1e47afab56cbc34fce32de232 100644 (file)
@@ -14,7 +14,6 @@
 
 #ifndef WX_PRECOMP
     #include <stdio.h>
-    #include "wx/setup.h"
     #include "wx/wxchar.h"
     #include "wx/string.h"
     #include "wx/bitmap.h"
@@ -46,10 +45,11 @@ MRESULT EXPENTRY wxRadioBoxWndProc( HWND   hWnd
 // global vars
 // ---------------------------------------------------------------------------
 
-// the pointer to standard radio button wnd proc
 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;
 
@@ -66,7 +66,6 @@ wxRadioBox::wxRadioBox()
 {
     m_nSelectedButton = -1;
     m_nNoItems = 0;
-    m_nNoRowsOrCols = 0;
     m_ahRadioButtons = NULL;
     m_pnRadioWidth = NULL;
     m_pnRadioHeight = NULL;
@@ -76,11 +75,17 @@ wxRadioBox::~wxRadioBox()
 {
     m_isBeingDeleted = true;
 
+    if (m_hWnd)
+        wxRemoveHandleAssociation(this);
     if (m_ahRadioButtons)
     {
-        int                         i;
-        for (i = 0; i < m_nNoItems; i++)
+        for (int i = 0; i < m_nNoItems; i++)
+        {
+            wxWindow* pWin = wxFindWinFromHandle((WXHWND)m_ahRadioButtons[i]);
+            wxRemoveHandleAssociation(pWin);
+
             ::WinDestroyWindow((HWND)m_ahRadioButtons[i]);
+    }
         delete[] m_ahRadioButtons;
     }
     if (m_pnRadioWidth)
@@ -89,143 +94,6 @@ wxRadioBox::~wxRadioBox()
         delete[] m_pnRadioHeight;
 } // end of wxRadioBox::~wxRadioBox
 
-void wxRadioBox::AdjustButtons( int nX,
-                                int nY,
-                                int nWidth,
-                                int nHeight,
-                                int WXUNUSED(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 % GetMajorDim()) == 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/GetMajorDim()) * GetMajorDim();
-        }
-
-        //
-        // Is this the start of new row/column?
-        //
-        if (i && (i % GetMajorDim() == 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 belonging to any radiobutton)
-        //
-        ::WinSetWindowPos( (HWND)m_ahRadioButtons[i]
-                          ,HWND_BOTTOM
-                          ,(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
 )
@@ -284,6 +152,7 @@ bool wxRadioBox::Create(
 {
     wxColour                        vColour;
     LONG                            lColor;
+    HWND                            hWndParent = GetHwndOf(pParent);
 
     vColour.Set(wxString(wxT("BLACK")));
     m_backgroundColour = pParent->GetBackgroundColour();
@@ -317,12 +186,7 @@ bool wxRadioBox::Create(
     //
     m_nNoItems = nNum;
     SetMajorDim(nMajorDim == 0 ? nNum : nMajorDim, lStyle);
-    m_nNoRowsOrCols = nMajorDim;
 
-    //
-    // Some radio boxes test consecutive id.
-    //
-    (void)NewControlId();
     m_ahRadioButtons = new WXHWND[nNum];
     m_pnRadioWidth   = new int[nNum];
     m_pnRadioHeight  = new int[nNum];
@@ -330,41 +194,42 @@ bool wxRadioBox::Create(
     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();
 
         if (i == 0)
-            lStyleBtn |= WS_GROUP;
-
-        HWND                        hWndBtn = (WXHWND)::WinCreateWindow ( GetHwndOf(pParent)
-                                                                         ,WC_BUTTON
-                                                                         ,::wxPMTextToLabel(asChoices[i])
-                                                                         ,lStyleBtn
-                                                                         ,0, 0, 0, 0
-                                                                         ,GetWinHwnd(pParent)
-                                                                         ,HWND_BOTTOM
-                                                                         ,(HMENU)nNewId
-                                                                         ,NULL
-                                                                         ,NULL
+            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)m_backgroundColour.GetPixel();
 
+        lColor = (LONG)m_backgroundColour.GetPixel();
         ::WinSetPresParam( hWndBtn
                           ,PP_BACKGROUNDCOLOR
                           ,sizeof(LONG)
                           ,(PVOID)&lColor
                          );
-        if (!hWndBtn)
-        {
-            return false;
-        }
         m_ahRadioButtons[i] = (WXHWND)hWndBtn;
         SubclassRadioButton((WXHWND)hWndBtn);
         wxAssociateWinWithHandle(hWndBtn, this);
@@ -378,18 +243,17 @@ bool wxRadioBox::Create(
     //
     // Create a dummy control to end the group.
     //
-    (void)::WinCreateWindow ( GetHwndOf(pParent),
+    (void)::WinCreateWindow ( hWndParent,
                               WC_BUTTON,
                               "",
                               WS_GROUP,
                               0, 0, 0, 0,
-                              GetWinHwnd(pParent),
+                              hWndParent,
                               HWND_TOP,
                               (HMENU)NewControlId(),
                               NULL,
                               NULL
                             );
-    SetFont(*wxSMALL_FONT);
     fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd()
                                                        ,(PFNWP)wxRadioBoxWndProc
                                                       );
@@ -421,7 +285,7 @@ bool wxRadioBox::Create(
 wxSize wxRadioBox::DoGetBestSize() const
 {
     return (GetTotalButtonSize(GetMaxButtonSize()));
-} // end of WinGuiBase_CRadioBox::DoGetBestSize
+} // end of wxRadioBox::DoGetBestSize
 
 void wxRadioBox::DoSetSize(
   int                               nX
@@ -431,6 +295,9 @@ void wxRadioBox::DoSetSize(
 , int                               nSizeFlags
 )
 {
+    //
+    // Input parameters assume wxWidgets coordinate system
+    //
     int                             nCurrentX;
     int                             nCurrentY;
     int                             nWidthOld;
@@ -505,22 +372,19 @@ void wxRadioBox::DoSetSize(
             nHeight = nHeightOld;
     }
 
+    //
+    // Now convert to OS/2 coordinate system
+    //
     wxWindowOS2*                    pParent = (wxWindowOS2*)GetParent();
-
     if (pParent)
-    {
-        int                         nOS2Height = GetOS2ParentHeight(pParent);
-
-        nYy = nOS2Height - (nYy + nHeight);
-        nYOffset = nYy + nHeight;
-    }
+        nYy = GetOS2ParentHeight(pParent) - nYy - nHeight;
     else
     {
         RECTL                       vRect;
-
         ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
-        nYy = vRect.yTop - (nYy + nHeight);
+        nYy = vRect.yTop - nYy - nHeight;
     }
+    nYOffset = nYy + nHeight;
     ::WinSetWindowPos( GetHwnd()
                       ,HWND_TOP
                       ,(LONG)nXx
@@ -582,7 +446,6 @@ void wxRadioBox::DoSetSize(
         {
             if (m_windowStyle & wxRA_SPECIFY_ROWS)
             {
-
                 //
                 // Start of new column
                 //
@@ -724,53 +587,6 @@ wxSize wxRadioBox::GetMaxButtonSize() const
     return maxsize;
 } // end of wxRadioBox::GetMaxButtonSize
 
-void wxRadioBox::GetPosition( int* pnX,
-                              int* WXUNUSED(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;
-    }
-    if (pnX)
-        *pnX = vPoint.y;
-} // end of wxRadioBox::GetPosition
-
 // Get single selection, for single choice list items
 int wxRadioBox::GetSelection() const
 {
@@ -780,7 +596,6 @@ int wxRadioBox::GetSelection() const
 void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const
 {
     RECT                            vRect;
-    int                             i;
 
     vRect.xLeft   = -1;
     vRect.xRight  = -1;
@@ -792,7 +607,7 @@ void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const
                       ,&vRect
                      );
 
-    for (i = 0; i < m_nNoItems; i++)
+    for (int i = 0; i < m_nNoItems; i++)
         wxFindMaxSize( m_ahRadioButtons[i]
                       ,&vRect
                      );
@@ -804,10 +619,9 @@ void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const
 } // 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
 
@@ -838,8 +652,8 @@ wxSize wxRadioBox::GetTotalButtonSize( const wxSize& rSizeBtn ) const
     //
     // And also wide enough for its label
     //
-    wxString                        sStr = wxGetWindowText(GetHwnd());
-    if (!sStr.IsEmpty())
+    wxString sStr = wxGetWindowText(GetHwnd());
+    if (!sStr.empty())
     {
         GetTextExtent( sStr
                       ,&nWidthLabel
@@ -887,7 +701,6 @@ bool wxRadioBox::OS2Command( WXUINT uCmd,
         if (wId == GetId())
             return true;
 
-
         for (int i = 0; i < m_nNoItems; i++)
         {
             if (wId == wxGetWindowId(m_ahRadioButtons[i]))