]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/radiobut.cpp
Fix for crash when opening empty node
[wxWidgets.git] / src / os2 / radiobut.cpp
index 540bb7deffc33561595ace19b5c6edc863e34880..81d6d4634423d7aa3ba546b5d4feafa95ad62725 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        radiobut.cpp
+// Name:        src/os2/radiobut.cpp
 // Purpose:     wxRadioButton
 // Author:      David Webster
 // Modified by:
 // Purpose:     wxRadioButton
 // Author:      David Webster
 // Modified by:
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #endif
 
-#ifndef WX_PRECOMP
-#include <stdio.h>
-#include "wx/setup.h"
 #include "wx/radiobut.h"
 #include "wx/radiobut.h"
-#include "wx/brush.h"
-#include "wx/dcscreen.h"
-#include "wx/settings.h"
+
+#ifndef WX_PRECOMP
+    #include <stdio.h>
+    #include "wx/brush.h"
+    #include "wx/dcscreen.h"
+    #include "wx/settings.h"
 #endif
 
 #include "wx/os2/private.h"
 #endif
 
 #include "wx/os2/private.h"
@@ -35,27 +35,23 @@ extern void  wxAssociateWinWithHandle( HWND         hWnd
 
 void wxRadioButton::Init()
 {
 
 void wxRadioButton::Init()
 {
-    m_bFocusJustSet = FALSE;
+    m_bFocusJustSet = false;
 } // end of wxRadioButton::Init
 
 } // end of wxRadioButton::Init
 
-void wxRadioButton::Command (
-  wxCommandEvent&                   rEvent
-)
+void wxRadioButton::Command ( wxCommandEvent& rEvent )
 {
     SetValue ((rEvent.GetInt() != 0) );
     ProcessCommand (rEvent);
 } // end of wxRadioButton::Command
 
 {
     SetValue ((rEvent.GetInt() != 0) );
     ProcessCommand (rEvent);
 } // end of wxRadioButton::Command
 
-bool wxRadioButton::Create(
-  wxWindow*                         pParent
-, wxWindowID                        vId
-, const wxString&                   rsLabel
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, long                              lStyle
-, const wxValidator&                rValidator
-, const wxString&                   rsName
-)
+bool wxRadioButton::Create( wxWindow* pParent,
+                            wxWindowID vId,
+                            const wxString& rsLabel,
+                            const wxPoint& rPos,
+                            const wxSize& rSize,
+                            long lStyle,
+                            const wxValidator& rValidator,
+                            const wxString& rsName )
 {
     if ( !CreateControl( pParent
                         ,vId
 {
     if ( !CreateControl( pParent
                         ,vId
@@ -64,7 +60,7 @@ bool wxRadioButton::Create(
                         ,lStyle
                         ,rValidator
                         ,rsName))
                         ,lStyle
                         ,rValidator
                         ,rsName))
-        return FALSE;
+        return false;
 
     long                            lSstyle = WS_TABSTOP;
 
 
     long                            lSstyle = WS_TABSTOP;
 
@@ -94,34 +90,24 @@ bool wxRadioButton::Create(
                           ,rsLabel
                           ,0
                          ))
                           ,rsLabel
                           ,0
                          ))
-        return FALSE;
+        return false;
 
     wxAssociateWinWithHandle(m_hWnd, this);
     if (HasFlag(wxRB_GROUP))
 
     wxAssociateWinWithHandle(m_hWnd, this);
     if (HasFlag(wxRB_GROUP))
-        SetValue(TRUE);
+        SetValue(true);
 
     SetFont(*wxSMALL_FONT);
 
     SetFont(*wxSMALL_FONT);
-    SetSize( rPos.x
-            ,rPos.y
-            ,rSize.x
-            ,rSize.y
-           );
-    return TRUE;
+    SetSize( rPos.x, rPos.y, rSize.x, rSize.y );
+    return true;
 } // end of wxRadioButton::Create
 
 wxSize wxRadioButton::DoGetBestSize() const
 {
 } // end of wxRadioButton::Create
 
 wxSize wxRadioButton::DoGetBestSize() const
 {
-    static int                      snRadioSize = 0;
-
-    if (!snRadioSize)
-    {
-        wxScreenDC                  vDC;
+    // We should probably compute snRadioSize but it seems to be a constant
+    // independent of its label's font size and not made available by OS/2.
+    static int                      snRadioSize = RADIO_SIZE;
 
 
-        vDC.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
-        snRadioSize = vDC.GetCharHeight();
-    }
-
-    wxString                        sStr = GetLabel();
+    wxString                        sStr = wxGetWindowText(GetHwnd());
     int                             nRadioWidth;
     int                             nRadioHeight;
 
     int                             nRadioWidth;
     int                             nRadioHeight;
 
@@ -131,7 +117,7 @@ wxSize wxRadioButton::DoGetBestSize() const
                       ,&nRadioWidth
                       ,&nRadioHeight
                      );
                       ,&nRadioWidth
                       ,&nRadioHeight
                      );
-        nRadioWidth += snRadioSize + GetCharWidth();
+        nRadioWidth += snRadioSize;
         if (nRadioHeight < snRadioSize)
             nRadioHeight = snRadioSize;
     }
         if (nRadioHeight < snRadioSize)
             nRadioHeight = snRadioSize;
     }
@@ -153,24 +139,21 @@ bool wxRadioButton::GetValue() const
     return((::WinSendMsg((HWND) GetHWND(), BM_QUERYCHECK, (MPARAM)0L, (MPARAM)0L) != 0));
 } // end of wxRadioButton::GetValue
 
     return((::WinSendMsg((HWND) GetHWND(), BM_QUERYCHECK, (MPARAM)0L, (MPARAM)0L) != 0));
 } // end of wxRadioButton::GetValue
 
-bool wxRadioButton::OS2Command(
-  WXUINT                            wParam
-, WXWORD                            wId
-)
+bool wxRadioButton::OS2Command( WXUINT wParam, WXWORD WXUNUSED(wId) )
 {
     if (wParam != BN_CLICKED)
 {
     if (wParam != BN_CLICKED)
-        return FALSE;
+        return false;
 
     if (m_bFocusJustSet)
     {
         //
         // See above: we want to ignore this event
         //
 
     if (m_bFocusJustSet)
     {
         //
         // See above: we want to ignore this event
         //
-        m_bFocusJustSet = FALSE;
+        m_bFocusJustSet = false;
     }
     else
     {
     }
     else
     {
-        bool                        bIsChecked = GetValue();
+        bool bIsChecked = GetValue();
 
         if (HasFlag(wxRB_SINGLE))
         {
 
         if (HasFlag(wxRB_SINGLE))
         {
@@ -180,16 +163,13 @@ bool wxRadioButton::OS2Command(
             // (presumably when another button is pressed)
             //
             if (!bIsChecked )
             // (presumably when another button is pressed)
             //
             if (!bIsChecked )
-                SetValue(TRUE);
+                SetValue(true);
         }
         }
-        wxCommandEvent              rEvent( wxEVT_COMMAND_RADIOBUTTON_SELECTED
-                                           ,m_windowId
-                                          );
-
+        wxCommandEvent rEvent( wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId );
         rEvent.SetEventObject(this);
         ProcessCommand(rEvent);
     }
         rEvent.SetEventObject(this);
         ProcessCommand(rEvent);
     }
-    return TRUE;
+    return true;
 } // end of wxRadioButton::OS2Command
 
 void wxRadioButton::SetFocus()
 } // end of wxRadioButton::OS2Command
 
 void wxRadioButton::SetFocus()
@@ -201,80 +181,83 @@ void wxRadioButton::SetFocus()
     // generates BN_CLICKED which leads to showing another dialog and so on
     // without end!
     //
     // generates BN_CLICKED which leads to showing another dialog and so on
     // without end!
     //
-    // to aviod this, we drop the pseudo BN_CLICKED events generated when the
+    // to avoid this, we drop the pseudo BN_CLICKED events generated when the
     // button gains focus
     // button gains focus
-    m_bFocusJustSet = TRUE;
+    m_bFocusJustSet = true;
 
     wxControl::SetFocus();
 }
 
 
     wxControl::SetFocus();
 }
 
-void wxRadioButton::SetLabel(
-  const wxString&                   rsLabel
-)
+void wxRadioButton::SetLabel( const wxString& rsLabel )
 {
 {
-    ::WinSetWindowText((HWND)GetHWND(), (const char *)rsLabel.c_str());
+    wxString                        sLabel = ::wxPMTextToLabel(rsLabel);
+    ::WinSetWindowText((HWND)GetHWND(), (const char *)sLabel.c_str());
 } // end of wxRadioButton::SetLabel
 
 } // end of wxRadioButton::SetLabel
 
-void wxRadioButton::SetValue(
-  bool                              bValue
-)
+void wxRadioButton::SetValue( bool bValue )
 {
     ::WinSendMsg((HWND)GetHWND(), BM_SETCHECK, (MPARAM)bValue, (MPARAM)0);
     if (bValue)
     {
         const wxWindowList&         rSiblings = GetParent()->GetChildren();
 {
     ::WinSendMsg((HWND)GetHWND(), BM_SETCHECK, (MPARAM)bValue, (MPARAM)0);
     if (bValue)
     {
         const wxWindowList&         rSiblings = GetParent()->GetChildren();
-        wxWindowList::Node*         pNodeThis = rSiblings.Find(this);
+        wxWindowList::compatibility_iterator nodeThis = rSiblings.Find(this);
 
 
-        wxCHECK_RET(pNodeThis, _T("radio button not a child of its parent?"));
+        wxCHECK_RET(nodeThis, _T("radio button not a child of its parent?"));
 
 
-        // 
-        // Turn off all radio buttons before this one
         //
         //
-        for ( wxWindowList::Node* pNodeBefore = pNodeThis->GetPrevious();
-              pNodeBefore;
-              pNodeBefore = pNodeBefore->GetPrevious() )
+        // If it's not the first item of the group ...
+        //
+        if ( !HasFlag(wxRB_GROUP) )
         {
         {
-            wxRadioButton*          pBtn = wxDynamicCast( pNodeBefore->GetData()
+            //
+            // ...turn off all radio buttons before this one
+            //
+            for ( wxWindowList::compatibility_iterator nodeBefore = nodeThis->GetPrevious();
+                  nodeBefore;
+                  nodeBefore = nodeBefore->GetPrevious() )
+            {
+                wxRadioButton*      pBtn = wxDynamicCast( nodeBefore->GetData()
                                                          ,wxRadioButton
                                                         );
                                                          ,wxRadioButton
                                                         );
-            if (!pBtn)
-            {
-                // 
-                // The radio buttons in a group must be consecutive, so there
-                // are no more of them
-                //
-                break;
-            }
-            pBtn->SetValue(FALSE);
-            if (pBtn->HasFlag(wxRB_GROUP))
-            {
-                // 
-                // Even if there are other radio buttons before this one,
-                // they're not in the same group with us
-                //
-                break;
+                if (!pBtn)
+                {
+                    //
+                    // The radio buttons in a group must be consecutive, so there
+                    // are no more of them
+                    //
+                    break;
+                }
+                pBtn->SetValue(false);
+                if (pBtn->HasFlag(wxRB_GROUP))
+                {
+                    //
+                    // Even if there are other radio buttons before this one,
+                    // they're not in the same group with us
+                    //
+                    break;
+                }
             }
         }
 
             }
         }
 
-        // 
+        //
         // ... and all after this one
         //
         // ... and all after this one
         //
-        for (wxWindowList::Node* pNodeAfter = pNodeThis->GetNext();
-             pNodeAfter;
-             pNodeAfter = pNodeAfter->GetNext())
+        for (wxWindowList::compatibility_iterator nodeAfter = nodeThis->GetNext();
+             nodeAfter;
+             nodeAfter = nodeAfter->GetNext())
         {
         {
-            wxRadioButton*          pBtn = wxDynamicCast( pNodeAfter->GetData()
+            wxRadioButton*          pBtn = wxDynamicCast( nodeAfter->GetData()
                                                          ,wxRadioButton
                                                         );
 
             if (!pBtn || pBtn->HasFlag(wxRB_GROUP) )
             {
                                                          ,wxRadioButton
                                                         );
 
             if (!pBtn || pBtn->HasFlag(wxRB_GROUP) )
             {
-                // 
+                //
                 // No more buttons or the first button of the next group
                 //
                 break;
             }
                 // No more buttons or the first button of the next group
                 //
                 break;
             }
-            pBtn->SetValue(FALSE);
+            pBtn->SetValue(false);
         }
     }
 } // end of wxRadioButton::SetValue
         }
     }
 } // end of wxRadioButton::SetValue
@@ -287,14 +270,14 @@ MRESULT wxRadioButton::OS2WindowProc(
 {
     if (uMsg == WM_SETFOCUS)
     {
 {
     if (uMsg == WM_SETFOCUS)
     {
-        m_bFocusJustSet = TRUE;
+        m_bFocusJustSet = true;
 
         MRESULT                     mRc = wxControl::OS2WindowProc( uMsg
                                                                    ,wParam
                                                                    ,lParam
                                                                   );
 
 
         MRESULT                     mRc = wxControl::OS2WindowProc( uMsg
                                                                    ,wParam
                                                                    ,lParam
                                                                   );
 
-        m_bFocusJustSet = FALSE;
+        m_bFocusJustSet = false;
         return mRc;
     }
     return wxControl::OS2WindowProc( uMsg
         return mRc;
     }
     return wxControl::OS2WindowProc( uMsg