]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/radiobox.cpp
Hopefully fixed library names generated by wx-config for OS/2's PM port.
[wxWidgets.git] / src / mac / carbon / radiobox.cpp
index 492c93133afb9bd2161adb2700fca191d66fd8c4..e2799918b45a3d004ac7cd82fb81aee5d311ea05 100644 (file)
@@ -1,36 +1,55 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobox.cpp
 // Purpose:     wxRadioBox
 /////////////////////////////////////////////////////////////////////////////
 // Name:        radiobox.cpp
 // Purpose:     wxRadioBox
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by: JS Lair (99/11/15) first implementation
 // Modified by: JS Lair (99/11/15) first implementation
-// Created:     ??/??/98
+// Created:     1998-01-01
 // RCS-ID:      $Id$
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:    wxWindows licence
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+#pragma implementation "radioboxbase.h"
+#pragma implementation "radiobox.h"
+#endif
+
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-//             headers
+//         headers
 //-------------------------------------------------------------------------------------
 
 //-------------------------------------------------------------------------------------
 
-#ifdef __GNUG__
-#pragma implementation "radiobox.h"
-#endif
+#include "wx/wxprec.h"
+
+#if wxUSE_RADIOBOX
+
+#include "wx/arrstr.h"
 
 #include "wx/radiobox.h"
 
 #include "wx/radiobox.h"
-#include <wx/mac/uma.h>
+#include "wx/radiobut.h"
+#include "wx/mac/uma.h"
 
 
-#if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
 IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
-#endif
-
-#pragma mark -
-#pragma mark ### Constructors & destructor ###
 
 //-------------------------------------------------------------------------------------
 
 //-------------------------------------------------------------------------------------
-//             ¥ wxRadioBox()
+//         ¥ wxRadioBox()
 //-------------------------------------------------------------------------------------
 // Default constructor
 //-------------------------------------------------------------------------------------
 // Default constructor
+BEGIN_EVENT_TABLE(wxRadioBox, wxControl)
+EVT_RADIOBUTTON( wxID_ANY , wxRadioBox::OnRadioButton )
+END_EVENT_TABLE()
+
+void wxRadioBox::OnRadioButton( wxCommandEvent &outer )
+{
+    if ( outer.IsChecked() )
+    {
+        wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId);
+        int i = GetSelection() ;
+        event.SetInt( i );
+        event.SetString( GetString( i ) );
+        event.SetEventObject( this );
+        ProcessCommand(event);
+    }
+}
 
 wxRadioBox::wxRadioBox()
 {
 
 wxRadioBox::wxRadioBox()
 {
@@ -41,9 +60,9 @@ wxRadioBox::wxRadioBox()
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ wxRadioBox(wxWindow*, wxWindowID, const wxString&, const wxPoint&, 
-//                                             const wxSize&, int, const wxString[], int, long, 
-//                                             const wxValidator&, const wxString&)
+//         ¥ wxRadioBox(wxWindow*, wxWindowID, const wxString&, const wxPoint&,
+//                        const wxSize&, int, const wxString[], int, long,
+//                        const wxValidator&, const wxString&)
 //-------------------------------------------------------------------------------------
 // Contructor, creating and showing a radiobox
 //
 //-------------------------------------------------------------------------------------
 // Contructor, creating and showing a radiobox
 //
@@ -51,37 +70,56 @@ wxRadioBox::wxRadioBox()
 //
 
 //-------------------------------------------------------------------------------------
 //
 
 //-------------------------------------------------------------------------------------
-//             ¥ ~wxRadioBox
+//         ¥ ~wxRadioBox
 //-------------------------------------------------------------------------------------
 // Destructor, destroying the radiobox item
 
 wxRadioBox::~wxRadioBox()
 {
 //-------------------------------------------------------------------------------------
 // Destructor, destroying the radiobox item
 
 wxRadioBox::~wxRadioBox()
 {
-       wxRadioButton *next,*current;
-       
+    m_isBeingDeleted = true;
+
+    wxRadioButton *next,*current;
+
     current=m_radioButtonCycle->NextInCycle();
     next=current->NextInCycle();
     while (current!=m_radioButtonCycle) {
     current=m_radioButtonCycle->NextInCycle();
     next=current->NextInCycle();
     while (current!=m_radioButtonCycle) {
-       delete current;
-       current=next;
-       next=current->NextInCycle();
-       }
-    delete current;    
+        delete current;
+        current=next;
+        next=current->NextInCycle();
+    }
+    delete current;
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ Create
+//         ¥ Create
 //-------------------------------------------------------------------------------------
 // Create the radiobox for two-step construction
 
 bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
 //-------------------------------------------------------------------------------------
 // Create the radiobox for two-step construction
 
 bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
-             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,
+                        const wxArrayString& choices,
+                        int majorDim, long style,
+                        const wxValidator& val, const wxString& name)
 {
 {
+    wxCArrayString chs(choices);
+
+    return Create(parent, id, label, pos, size, chs.GetCount(),
+                  chs.GetStrings(), majorDim, style, val, name);
+}
+
+bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
+                        const wxPoint& pos, const wxSize& size,
+                        int n, const wxString choices[],
+                        int majorDim, long style,
+                        const wxValidator& val, const wxString& name)
+{
+    m_macIsUserPane = false ;
+
+    if ( !wxControl::Create(parent, id, pos, size, style, val, name) )
+        return false;
+
     int i;
     int i;
-    
+
     m_noItems = n;
     m_noRowsOrCols = majorDim;
     m_radioButtonCycle = NULL;
     m_noItems = n;
     m_noRowsOrCols = majorDim;
     m_radioButtonCycle = NULL;
@@ -92,97 +130,87 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
         m_majorDim = majorDim ;
 
 
         m_majorDim = majorDim ;
 
 
-       Rect bounds ;
-       Str255 title ;
-       
-       MacPreControlCreate( parent , id ,  label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
+    m_label = label ;
+
+    Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ;
+    if( bounds.right <= bounds.left )
+        bounds.right = bounds.left + 100 ;
+    if ( bounds.bottom <= bounds.top )
+        bounds.bottom = bounds.top + 100 ;
+
+    m_peer = new wxMacControl(this) ;
 
 
-       m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
-               kControlGroupBoxTextTitleProc , (long) this ) ;
-       
-       MacPostControlCreate() ;
+    verify_noerr(CreateGroupBoxControl(MAC_WXHWND(parent->MacGetTopLevelWindowRef()),&bounds, CFSTR("") ,
+        true /*primary*/ , m_peer->GetControlRefAddr() ) ) ;
 
     for (i = 0; i < n; i++)
     {
 
     for (i = 0; i < n; i++)
     {
-        wxRadioButton *radBtn = new wxRadioButton(this, NewControlId(),choices[i],wxPoint(5,20*i+10));
-        m_radioButtonCycle=radBtn->AddInCycle(m_radioButtonCycle);
+        wxRadioButton *radBtn = new wxRadioButton
+                                    (
+                                        this,
+                                        wxID_ANY,
+                                        wxStripMenuCodes(choices[i]),
+                                        wxPoint(5,20*i+10),
+                                        wxDefaultSize,
+                                        i == 0 ? wxRB_GROUP : 0
+                                    );
+        if ( i == 0 )
+            m_radioButtonCycle = radBtn ;
+        //        m_radioButtonCycle=radBtn->AddInCycle(m_radioButtonCycle);
     }
 
     }
 
-       SetSelection(0);
-       SetSize(pos.x,pos.y,size.x,size.y);
+    SetSelection(0);
+    MacPostControlCreate(pos,size) ;
 
 
-  return TRUE;
+    return true;
 }
 
 
 }
 
 
-#pragma mark -
-#pragma mark ### Specific functions (reference v2) ###
-
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-//             ¥ Enable(bool)
+//         ¥ Enable(bool)
 //-------------------------------------------------------------------------------------
 // Enables or disables the entire radiobox
 
 bool wxRadioBox::Enable(bool enable)
 {
 //-------------------------------------------------------------------------------------
 // Enables or disables the entire radiobox
 
 bool wxRadioBox::Enable(bool enable)
 {
-       int i;
+    int i;
     wxRadioButton *current;
     wxRadioButton *current;
-    
+
     if (!wxControl::Enable(enable))
     if (!wxControl::Enable(enable))
-       return (false);
+        return false;
 
 
-    current=m_radioButtonCycle;
-       for (i=0;i<m_noItems;i++) {
-       current->Enable(enable);
-       current=current->NextInCycle();
-       }
-    return (true);
+    current = m_radioButtonCycle;
+    for (i = 0; i < m_noItems; i++) {
+        current->Enable(enable);
+        current = current->NextInCycle();
+    }
+    return true;
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ Enable(int, bool)
+//         ¥ Enable(int, bool)
 //-------------------------------------------------------------------------------------
 // Enables or disables an given button
 
 //-------------------------------------------------------------------------------------
 // Enables or disables an given button
 
-void wxRadioBox::Enable(int item, bool enable)
+bool wxRadioBox::Enable(int item, bool enable)
 {
 {
-       int i;
+    int i;
     wxRadioButton *current;
     wxRadioButton *current;
-    
-    if ((item < 0) || (item >= m_noItems))
-        return;
-    i=0;
-    current=m_radioButtonCycle;
-    while (i!=item) {
-       i++;
-       current=current->NextInCycle();
-       }
-}
 
 
+    if (!IsValid(item))
+        return false;
 
 
-//-------------------------------------------------------------------------------------
-//             ¥ FindString
-//-------------------------------------------------------------------------------------
-// Finds a button matching the given string, returning the position if found 
-// or -1 if not found
-
-int wxRadioBox::FindString(const wxString& s) const
-{
-    int i;
-    wxRadioButton *current;
-    
-    current=m_radioButtonCycle;
-    for (i = 0; i < m_noItems; i++)
-    {
-        if (s == current->GetLabel())
-            return i;
-       current=current->NextInCycle();
+    i = 0;
+    current = m_radioButtonCycle;
+    while (i != item) {
+        i++;
+        current = current->NextInCycle();
     }
     }
-    return -1;
+    return current->Enable(enable);
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ GetLabel()
+//         ¥ GetLabel()
 //-------------------------------------------------------------------------------------
 // Returns the radiobox label
 
 //-------------------------------------------------------------------------------------
 // Returns the radiobox label
 
@@ -192,28 +220,29 @@ wxString wxRadioBox::GetLabel() const
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ GetLabel(int)
+//         ¥ GetLabel(int)
 //-------------------------------------------------------------------------------------
 // Returns the label for the given button
 
 //-------------------------------------------------------------------------------------
 // Returns the label for the given button
 
-wxString wxRadioBox::GetLabel(int item) const
+wxString wxRadioBox::GetString(int item) const
 {
 {
-       int i;
+    int i;
     wxRadioButton *current;
     wxRadioButton *current;
-    
-    if ((item < 0) || (item >= m_noItems))
-        return wxString("");
-    i=0;
-    current=m_radioButtonCycle;
-    while (i!=item) {
-       i++;
-       current=current->NextInCycle();
-       }
+
+    if (!IsValid(item))
+        return wxEmptyString;
+
+    i = 0;
+    current = m_radioButtonCycle;
+    while (i != item) {
+        i++;
+        current = current->NextInCycle();
+    }
     return current->GetLabel();
 }
 
 //-------------------------------------------------------------------------------------
     return current->GetLabel();
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ GetSelection
+//         ¥ GetSelection
 //-------------------------------------------------------------------------------------
 // Returns the zero-based position of the selected button
 
 //-------------------------------------------------------------------------------------
 // Returns the zero-based position of the selected button
 
@@ -221,44 +250,19 @@ int wxRadioBox::GetSelection() const
 {
     int i;
     wxRadioButton *current;
 {
     int i;
     wxRadioButton *current;
-    
+
     i=0;
     current=m_radioButtonCycle;
     while (!current->GetValue()) {
     i=0;
     current=m_radioButtonCycle;
     while (!current->GetValue()) {
-       i++;
-       current=current->NextInCycle();
-       }
+        i++;
+        current=current->NextInCycle();
+    }
 
     return i;
 }
 
 //-------------------------------------------------------------------------------------
 
     return i;
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ GetString
-//-------------------------------------------------------------------------------------
-// Find string for position
-
-wxString wxRadioBox::GetString(int item) const
-{
-
-    return GetLabel(item);
-}
-
-//-------------------------------------------------------------------------------------
-//             ¥ GetStringSelection
-//-------------------------------------------------------------------------------------
-// Returns the selected string
-
-wxString wxRadioBox::GetStringSelection () const
-{
-    int sel = GetSelection ();
-    if (sel > -1)
-        return this->GetString (sel);
-    else
-        return wxString("");
-}
-
-//-------------------------------------------------------------------------------------
-//             ¥ Number
+//         ¥ Number
 //-------------------------------------------------------------------------------------
 // Returns the number of buttons in the radiobox
 //
 //-------------------------------------------------------------------------------------
 // Returns the number of buttons in the radiobox
 //
@@ -266,7 +270,7 @@ wxString wxRadioBox::GetStringSelection () const
 //
 
 //-------------------------------------------------------------------------------------
 //
 
 //-------------------------------------------------------------------------------------
-//             ¥ SetLabel(const wxString&)
+//         ¥ SetLabel(const wxString&)
 //-------------------------------------------------------------------------------------
 // Sets the radiobox label
 
 //-------------------------------------------------------------------------------------
 // Sets the radiobox label
 
@@ -276,113 +280,93 @@ void wxRadioBox::SetLabel(const wxString& label)
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ SetLabel(int, const wxString&)
+//         ¥ SetLabel(int, const wxString&)
 //-------------------------------------------------------------------------------------
 // Sets the label of a given button
 
 //-------------------------------------------------------------------------------------
 // Sets the label of a given button
 
-void wxRadioBox::SetLabel(int item,const wxString& label)
+void wxRadioBox::SetString(int item,const wxString& label)
 {
 {
-       int i;
+       int i;
     wxRadioButton *current;
     wxRadioButton *current;
-    
-    if ((item < 0) || (item >= m_noItems))
+
+    if (!IsValid(item))
         return;
         return;
-       i=0;
+    i=0;
     current=m_radioButtonCycle;
     while (i!=item) {
     current=m_radioButtonCycle;
     while (i!=item) {
-       i++;
-       current=current->NextInCycle();
-       }
+        i++;
+        current=current->NextInCycle();
+    }
     return current->SetLabel(label);
 }
 
 //-------------------------------------------------------------------------------------
     return current->SetLabel(label);
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ SetSelection
+//         ¥ SetSelection
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-// Sets a button by passing the desired position. This does not cause 
+// Sets a button by passing the desired position. This does not cause
 // wxEVT_COMMAND_RADIOBOX_SELECTED event to get emitted
 
 void wxRadioBox::SetSelection(int item)
 {
     int i;
     wxRadioButton *current;
 // wxEVT_COMMAND_RADIOBOX_SELECTED event to get emitted
 
 void wxRadioBox::SetSelection(int item)
 {
     int i;
     wxRadioButton *current;
-    
-    if ((item < 0) || (item >= m_noItems))
+
+    if (!IsValid(item))
         return;
     i=0;
     current=m_radioButtonCycle;
     while (i!=item) {
         return;
     i=0;
     current=m_radioButtonCycle;
     while (i!=item) {
-       i++;
-       current=current->NextInCycle();
-       }
+        i++;
+        current=current->NextInCycle();
+    }
     current->SetValue(true);
     current->SetValue(true);
-    
-}
 
 
-//-------------------------------------------------------------------------------------
-//             ¥ SetStringSelection
-//-------------------------------------------------------------------------------------
-// Sets a button by passing the desired string. This does not cause 
-// wxEVT_COMMAND_RADIOBOX_SELECTED event to get emitted
-
-bool wxRadioBox::SetStringSelection (const wxString& s)
-{
-    int sel = FindString (s);
-    if (sel > -1)
-    {
-        SetSelection (sel);
-        return TRUE;
-    }
-    else
-        return FALSE;
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ Show(bool)
+//         ¥ Show(bool)
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-// Shows or hides the entire radiobox 
+// Shows or hides the entire radiobox
 
 bool wxRadioBox::Show(bool show)
 {
     int i;
     wxRadioButton *current;
 
 bool wxRadioBox::Show(bool show)
 {
     int i;
     wxRadioButton *current;
-    
+
     wxControl::Show(show);
 
     current=m_radioButtonCycle;
     wxControl::Show(show);
 
     current=m_radioButtonCycle;
-       for (i=0;i<m_noItems;i++) {
-       current->Show(show);
-       current=current->NextInCycle();
-       }
+    for (i=0;i<m_noItems;i++)
+    {
+        current->Show(show);
+        current=current->NextInCycle();
+    }
     return true;
 }
 
 //-------------------------------------------------------------------------------------
     return true;
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ Show(int, bool)
+//         ¥ Show(int, bool)
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-// Shows or hides the given button 
+// Shows or hides the given button
 
 
-void wxRadioBox::Show(int item, bool show)
+bool wxRadioBox::Show(int item, bool show)
 {
 {
-       int i;
+    int i;
     wxRadioButton *current;
     wxRadioButton *current;
-    
-    if ((item < 0) || (item >= m_noItems))
-        return;
+
+    if (!IsValid(item))
+        return false;
     i=0;
     current=m_radioButtonCycle;
     while (i!=item) {
     i=0;
     current=m_radioButtonCycle;
     while (i!=item) {
-       i++;
-       current=current->NextInCycle();
-       }
-    current->Show(show);
+        i++;
+        current=current->NextInCycle();
+    }
+    return current->Show(show);
 }
 
 }
 
-#pragma mark -
-#pragma mark ### Other external functions ###
-
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-//             ¥ Command
+//         ¥ Command
 //-------------------------------------------------------------------------------------
 // Simulates the effect of the user issuing a command to the item
 
 //-------------------------------------------------------------------------------------
 // Simulates the effect of the user issuing a command to the item
 
@@ -393,7 +377,7 @@ void wxRadioBox::Command (wxCommandEvent & event)
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ SetFocus
+//         ¥ SetFocus
 //-------------------------------------------------------------------------------------
 // Sets the selected button to receive keyboard input
 
 //-------------------------------------------------------------------------------------
 // Sets the selected button to receive keyboard input
 
@@ -401,22 +385,19 @@ void wxRadioBox::SetFocus()
 {
     int i;
     wxRadioButton *current;
 {
     int i;
     wxRadioButton *current;
-    
+
     i=0;
     current=m_radioButtonCycle;
     while (!current->GetValue()) {
     i=0;
     current=m_radioButtonCycle;
     while (!current->GetValue()) {
-       i++;
-       current=current->NextInCycle();
-       }
-       current->SetFocus();
+        i++;
+        current=current->NextInCycle();
+    }
+    current->SetFocus();
 }
 
 
 }
 
 
-#pragma mark -
-#pragma mark ### Internal functions ###
-
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-//             ¥ DoSetSize
+//         ¥ DoSetSize
 //-------------------------------------------------------------------------------------
 // Simulates the effect of the user issuing a command to the item
 
 //-------------------------------------------------------------------------------------
 // Simulates the effect of the user issuing a command to the item
 
@@ -424,92 +405,154 @@ void wxRadioBox::SetFocus()
 
 void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
 
 void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
-       int i;
-       wxRadioButton *current;
+    int i;
+    wxRadioButton *current;
 
 
-// define the position
+    // define the position
 
 
-       int x_current, y_current;
-       int x_offset,y_offset;
+    int x_current, y_current;
+    int x_offset,y_offset;
+    int widthOld, heightOld;
+    GetSize(&widthOld, &heightOld);
 
 
-       x_offset = x;
-       y_offset = y;
-       GetPosition(&x_current, &y_current);
-       if ((x == -1) || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
-               x_offset = x_current;
-       if ((y == -1) || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
-               y_offset = y_current;
+    x_offset = x;
+    y_offset = y;
+    GetPosition(&x_current, &y_current);
+    if ((x == wxDefaultCoord) && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+        x_offset = x_current;
+    if ((y == wxDefaultCoord)&& !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+        y_offset = y_current;
 
 
-// define size
+    // define size
 
 
-       int charWidth,charHeight;
-       int maxWidth,maxHeight;
-       int eachWidth[128],eachHeight[128];
+    int charWidth,charHeight;
+    int maxWidth,maxHeight;
+    int eachWidth[128],eachHeight[128];
     int totWidth,totHeight;
 
     int totWidth,totHeight;
 
-       SetFont(GetParent()->GetFont());
-       GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight);
-       charWidth/=52;
-
-       maxWidth=-1;
-       maxHeight=-1;
-       for (i = 0 ; i < m_noItems; i++)
-               {
-               GetTextExtent(GetLabel(i), &eachWidth[i], &eachHeight[i]);
-               eachWidth[i] = (int)(eachWidth[i] + RADIO_SIZE);
-               eachHeight[i] = (int)((3*eachHeight[i])/2);
-               if (maxWidth<eachWidth[i]) maxWidth = eachWidth[i];
-               if (maxHeight<eachHeight[i]) maxHeight = eachHeight[i];
-               }
-
-       totHeight = GetNumVer() * (maxHeight + charHeight/2) + charHeight*3/2;
-       totWidth  = GetNumHor() * (maxWidth + charWidth) + charWidth;
-
-       wxControl::DoSetSize(x_offset,y_offset,totWidth,totHeight,wxSIZE_AUTO);
-
-// arrange radiobuttons
-
-       int x_start,y_start;
-       
-       
-       x_start = charWidth;
-       y_start = charHeight*3/2;
-       x_offset = x_start;
-       y_offset = y_start;
-       
-       current=m_radioButtonCycle;  
-       for ( i = 0 ; i < m_noItems; i++)
-               {
-               if (i&&((i%m_majorDim)==0)) // not to do for the zero button!
-               {
-               if (m_windowStyle & wxRA_VERTICAL)
-                       {
-                           x_offset += maxWidth + charWidth;
-                       y_offset = y_start;
-                               }
-               else
-                       {
-                               x_offset = x_start;
-                       y_offset += maxHeight + charHeight/2;
-                               }
-                       }
-
-               current->SetSize(x_offset,y_offset,eachWidth[i],eachHeight[i]);
-               current=current->NextInCycle();
-               
-               if (m_windowStyle & wxRA_SPECIFY_ROWS)
-                       y_offset += maxHeight + charHeight/2;
-               else
-                       x_offset += maxWidth + charWidth;
-               }
+    GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight);
+
+    charWidth/=52;
+
+    maxWidth=-1;
+    maxHeight=-1;
+    for (i = 0 ; i < m_noItems; i++)
+    {
+        GetTextExtent(GetString(i), &eachWidth[i], &eachHeight[i]);
+        eachWidth[i] = (int)(eachWidth[i] + RADIO_SIZE);
+        eachHeight[i] = (int)((3*eachHeight[i])/2);
+        if (maxWidth<eachWidth[i]) maxWidth = eachWidth[i];
+        if (maxHeight<eachHeight[i]) maxHeight = eachHeight[i];
+    }
+
+    totHeight = GetRowCount() * ( maxHeight ) ;
+    totWidth  = GetColumnCount() * (maxWidth + charWidth) ;
+
+    wxSize sz = DoGetSizeFromClientSize( wxSize( totWidth , totHeight ) ) ;
+
+    // only change our width/height if asked for
+    if ( width == wxDefaultCoord )
+    {
+        if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+            width = sz.x ;
+        else
+            width = widthOld;
+    }
+
+    if ( height == wxDefaultCoord )
+    {
+        if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+            height = sz.y ;
+        else
+            height = heightOld;
+    }
+
+    wxControl::DoSetSize(x_offset,y_offset,width,height,wxSIZE_AUTO);
+
+    // arrange radiobuttons
+
+    int x_start,y_start;
+
+
+    x_start = 0;
+    y_start = 0 ;
+
+    x_offset = x_start;
+    y_offset = y_start;
+
+    current=m_radioButtonCycle;
+    for ( i = 0 ; i < m_noItems; i++)
+    {
+        if (i&&((i%m_majorDim)==0)) // not to do for the zero button!
+        {
+            if (m_windowStyle & wxRA_SPECIFY_ROWS)
+            {
+                x_offset += maxWidth + charWidth;
+                y_offset = y_start;
+            }
+            else
+            {
+                x_offset = x_start;
+                y_offset += maxHeight ; /*+ charHeight/2;*/
+            }
+        }
+
+        current->SetSize(x_offset,y_offset,eachWidth[i],eachHeight[i]);
+        current=current->NextInCycle();
+
+        if (m_windowStyle & wxRA_SPECIFY_ROWS)
+            y_offset += maxHeight ; /*+ charHeight/2;*/
+        else
+            x_offset += maxWidth + charWidth;
+    }
 }
 
 }
 
+wxSize wxRadioBox::DoGetBestSize() const
+{
+    int charWidth, charHeight;
+    int maxWidth, maxHeight;
+    int eachWidth, eachHeight;
+    int totWidth, totHeight;
+
+    wxFont font = /*GetParent()->*/GetFont();
+    GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
+        &charWidth, &charHeight, NULL, NULL, &font);
+
+    charWidth /= 52;
+
+    maxWidth = -1;
+    maxHeight = -1;
+
+    for (int i = 0 ; i < m_noItems; i++)
+    {
+        GetTextExtent(GetString(i), &eachWidth, &eachHeight,NULL, NULL, &font);
+        eachWidth  = (int)(eachWidth + RADIO_SIZE) ;
+        eachHeight = (int)((3 * eachHeight) / 2);
+        if (maxWidth < eachWidth)     maxWidth = eachWidth;
+        if (maxHeight < eachHeight)   maxHeight = eachHeight;
+    }
+
+    totHeight = GetRowCount() * (maxHeight ) ;
+    totWidth  = GetColumnCount() * (maxWidth + charWidth) ;
+
+    wxSize sz = DoGetSizeFromClientSize( wxSize( totWidth , totHeight ) ) ;
+    totWidth = sz.x ;
+    totHeight = sz.y ;
+
+    // handle radio box title as well
+    GetTextExtent(GetTitle(), &eachWidth, NULL);
+    eachWidth  = (int)(eachWidth + RADIO_SIZE) + 3 * charWidth ;
+    if (totWidth < eachWidth)
+        totWidth = eachWidth;
+
+    return wxSize(totWidth, totHeight);
+}
 //-------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------
-//             ¥ GetNumVer
+//         ¥ GetNumVer
 //-------------------------------------------------------------------------------------
 // return the number of buttons in the vertical direction
 
 //-------------------------------------------------------------------------------------
 // return the number of buttons in the vertical direction
 
-int wxRadioBox::GetNumVer() const
+int wxRadioBox::GetRowCount() const
 {
     if ( m_windowStyle & wxRA_SPECIFY_ROWS )
     {
 {
     if ( m_windowStyle & wxRA_SPECIFY_ROWS )
     {
@@ -522,11 +565,11 @@ int wxRadioBox::GetNumVer() const
 }
 
 //-------------------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------------------
-//             ¥ GetNumHor
+//         ¥ GetNumHor
 //-------------------------------------------------------------------------------------
 // return the number of buttons in the horizontal direction
 
 //-------------------------------------------------------------------------------------
 // return the number of buttons in the horizontal direction
 
-int wxRadioBox::GetNumHor() const
+int wxRadioBox::GetColumnCount() const
 {
     if ( m_windowStyle & wxRA_SPECIFY_ROWS )
     {
 {
     if ( m_windowStyle & wxRA_SPECIFY_ROWS )
     {
@@ -538,7 +581,4 @@ int wxRadioBox::GetNumHor() const
     }
 }
 
     }
 }
 
-
-
-
-
+#endif