]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/radiobut.cpp
Fixed post-expand/collapse rendering
[wxWidgets.git] / src / msw / radiobut.cpp
index f3d6507c8ca886cca0a516063a4a9a487f93c2c7..01e5fd8dbb6966bf60fbb39fba45717556cee884 100644 (file)
@@ -121,30 +121,26 @@ bool wxRadioButton::Create(wxWindow *parent,
     if ( HasFlag(wxRB_GROUP) )
         msStyle |= WS_GROUP;
 
     if ( HasFlag(wxRB_GROUP) )
         msStyle |= WS_GROUP;
 
-    /*
-       wxRB_SINGLE is a temporary workaround for the following problem: if you
-       have 2 radiobuttons in the same group but which are not consecutive in
-       the dialog, Windows can enter an infinite loop! The simplest way to
-       reproduce it is to create radio button, then a panel and then another
-       radio button: then checking the last button hangs the app.
-
-       Ideally, we'd detect (and avoid) such situation automatically but for
-       now, as I don't know how to do it, just allow the user to create
-       BS_RADIOBUTTON buttons for such situations.
-     */
-    msStyle |= HasFlag(wxRB_SINGLE) ? BS_RADIOBUTTON : BS_AUTORADIOBUTTON;
+    // we use BS_RADIOBUTTON and not BS_AUTORADIOBUTTON because the use of the
+    // latter can easily result in the application entering an infinite loop
+    // inside IsDialogMessage()
+    //
+    // we used to use BS_RADIOBUTTON only for wxRB_SINGLE buttons but there
+    // doesn't seem to be any harm to always use it and it prevents some hangs,
+    // see #9786
+    msStyle |= BS_RADIOBUTTON;
 
     if ( HasFlag(wxCLIP_SIBLINGS) )
         msStyle |= WS_CLIPSIBLINGS;
     if ( HasFlag(wxALIGN_RIGHT) )
         msStyle |= BS_LEFTTEXT | BS_RIGHT;
 
 
     if ( HasFlag(wxCLIP_SIBLINGS) )
         msStyle |= WS_CLIPSIBLINGS;
     if ( HasFlag(wxALIGN_RIGHT) )
         msStyle |= BS_LEFTTEXT | BS_RIGHT;
 
-    if ( !MSWCreateControl(_T("BUTTON"), msStyle, pos, size, label, 0) )
+    if ( !MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, 0) )
         return false;
 
     // for compatibility with wxGTK, the first radio button in a group is
     // always checked (this makes sense anyhow as you need to ensure that at
         return false;
 
     // for compatibility with wxGTK, the first radio button in a group is
     // always checked (this makes sense anyhow as you need to ensure that at
-    // least one button in the group is checked and this is the simlpest way to
+    // least one button in the group is checked and this is the simplest way to
     // do it)
     if ( HasFlag(wxRB_GROUP) )
         SetValue(true);
     // do it)
     if ( HasFlag(wxRB_GROUP) )
         SetValue(true);
@@ -170,18 +166,18 @@ void wxRadioButton::SetValue(bool value)
     // buttons in the same group: Windows doesn't do it automatically
     //
     // moreover, if another radiobutton in the group currently has the focus,
     // buttons in the same group: Windows doesn't do it automatically
     //
     // moreover, if another radiobutton in the group currently has the focus,
-    // we have to set it to this radiobutton, else the old readiobutton will be
+    // we have to set it to this radiobutton, else the old radiobutton will be
     // reselected automatically, if a parent window loses the focus and regains
     // it.
     wxWindow * const focus = FindFocus();
     wxTopLevelWindow * const
         tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
     // reselected automatically, if a parent window loses the focus and regains
     // it.
     wxWindow * const focus = FindFocus();
     wxTopLevelWindow * const
         tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
-    wxCHECK_RET( tlw, _T("radio button outside of TLW?") );
+    wxCHECK_RET( tlw, wxT("radio button outside of TLW?") );
     wxWindow * const focusInTLW = tlw->GetLastFocus();
 
     const wxWindowList& siblings = GetParent()->GetChildren();
     wxWindowList::compatibility_iterator nodeThis = siblings.Find(this);
     wxWindow * const focusInTLW = tlw->GetLastFocus();
 
     const wxWindowList& siblings = GetParent()->GetChildren();
     wxWindowList::compatibility_iterator nodeThis = siblings.Find(this);
-    wxCHECK_RET( nodeThis, _T("radio button not a child of its parent?") );
+    wxCHECK_RET( nodeThis, wxT("radio button not a child of its parent?") );
 
     // this will be set to true in the code below if the focus is in our TLW
     // and belongs to one of the other buttons in the same group
 
     // this will be set to true in the code below if the focus is in our TLW
     // and belongs to one of the other buttons in the same group
@@ -266,7 +262,7 @@ bool wxRadioButton::GetValue() const
 {
     wxASSERT_MSG( m_isChecked ==
                     (::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0L) != 0),
 {
     wxASSERT_MSG( m_isChecked ==
                     (::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0L) != 0),
-                  _T("wxRadioButton::m_isChecked is out of sync?") );
+                  wxT("wxRadioButton::m_isChecked is out of sync?") );
 
     return m_isChecked;
 }
 
     return m_isChecked;
 }
@@ -288,9 +284,8 @@ bool wxRadioButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 
     if ( !m_isChecked )
     {
 
     if ( !m_isChecked )
     {
-        // we have to do this for BS_RADIOBUTTON anyhow and, strangely enough,
-        // sometimes this is needed even for BS_AUTORADIOBUTTON (when we
-        // receive focus the button gets BN_CLICKED but stays unchecked!)
+        // we need to manually update the button state as we use BS_RADIOBUTTON
+        // and not BS_AUTORADIOBUTTON
         SetValue(true);
 
         wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, GetId());
         SetValue(true);
 
         wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, GetId());