]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/radiobox.cpp
switched to MacOS 8.5+ implementation for submenus
[wxWidgets.git] / src / mac / carbon / radiobox.cpp
index d00911c8fd4347471c50f6d0b953ec8db95c24f7..6c9ba1abb2287544d04a9890f1b59b1c6dc95b5d 100644 (file)
 //-------------------------------------------------------------------------------------
 
 #ifdef __GNUG__
-#pragma implementation "radiobox.h"
+  #pragma implementation "radioboxbase.h"
+  #pragma implementation "radiobox.h"
 #endif
 
+#include "wx/defs.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)
@@ -31,6 +35,22 @@ IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
 //             ¥ wxRadioBox()
 //-------------------------------------------------------------------------------------
 // Default constructor
+BEGIN_EVENT_TABLE(wxRadioBox, wxControl)
+EVT_RADIOBUTTON( -1 , 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()
 {
@@ -92,26 +112,27 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
         m_majorDim = majorDim ;
 
 
-       Rect bounds ;
-       Str255 title ;
-       
-       MacPreControlCreate( parent , id ,  label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
-
-       m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
-               kControlGroupBoxTextTitleProc , (long) this ) ;
-       
-       MacPostControlCreate() ;
-
+    Rect bounds ;
+    Str255 title ;
+    
+    MacPreControlCreate( parent , id ,  wxStripMenuCodes(label) , pos , size ,style, val , name , &bounds , title ) ;
+    
+    m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1, 
+                                 kControlGroupBoxTextTitleProc , (long) this ) ;
+    
     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, NewControlId(), 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() ;
 
-  return TRUE;
+    return TRUE;
 }
 
 
@@ -123,18 +144,20 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
 //-------------------------------------------------------------------------------------
 // Enables or disables the entire radiobox
 
-void wxRadioBox::Enable(bool enable)
+bool wxRadioBox::Enable(bool enable)
 {
-       int i;
+    int i;
     wxRadioButton *current;
     
-    wxControl::Enable(enable);
-
-    current=m_radioButtonCycle;
-       for (i=0;i<m_noItems;i++) {
+    if (!wxControl::Enable(enable))
+       return false;
+    
+    current = m_radioButtonCycle;
+    for (i = 0; i < m_noItems; i++) {
        current->Enable(enable);
-       current=current->NextInCycle();
-       }
+       current = current->NextInCycle();
+    }
+    return true;
 }
 
 //-------------------------------------------------------------------------------------
@@ -144,40 +167,19 @@ void wxRadioBox::Enable(bool enable)
 
 void wxRadioBox::Enable(int item, bool enable)
 {
-       int i;
+    int i;
     wxRadioButton *current;
     
     if ((item < 0) || (item >= m_noItems))
         return;
-    i=0;
-    current=m_radioButtonCycle;
-    while (i!=item) {
-       i++;
-       current=current->NextInCycle();
-       }
-    return current->Enable(enable);
-}
-
-
-//-------------------------------------------------------------------------------------
-//             ¥ 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;
+    current->Enable(enable);
 }
 
 //-------------------------------------------------------------------------------------
@@ -195,19 +197,20 @@ wxString wxRadioBox::GetLabel() const
 //-------------------------------------------------------------------------------------
 // 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;
     
     if ((item < 0) || (item >= m_noItems))
         return wxString("");
-    i=0;
-    current=m_radioButtonCycle;
-    while (i!=item) {
+    
+    i = 0;
+    current = m_radioButtonCycle;
+    while (i != item) {
        i++;
-       current=current->NextInCycle();
-       }
+       current = current->NextInCycle();
+    }
     return current->GetLabel();
 }
 
@@ -231,31 +234,6 @@ int wxRadioBox::GetSelection() const
     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
 //-------------------------------------------------------------------------------------
@@ -279,7 +257,7 @@ void wxRadioBox::SetLabel(const wxString& label)
 //-------------------------------------------------------------------------------------
 // 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;
     wxRadioButton *current;
@@ -318,24 +296,6 @@ void wxRadioBox::SetSelection(int item)
     
 }
 
-//-------------------------------------------------------------------------------------
-//             ¥ 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)
 //-------------------------------------------------------------------------------------
@@ -419,7 +379,7 @@ void wxRadioBox::SetFocus()
 //-------------------------------------------------------------------------------------
 // Simulates the effect of the user issuing a command to the item
 
-#define RADIO_SIZE 20
+#define RADIO_SIZE 40
 
 void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
@@ -430,13 +390,15 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 
        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))
+       if ((x == -1) && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
                x_offset = x_current;
-       if ((y == -1) || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+       if ((y == -1)&& !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
                y_offset = y_current;
 
 // define size
@@ -454,17 +416,34 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
        maxHeight=-1;
        for (i = 0 ; i < m_noItems; i++)
                {
-               GetTextExtent(GetLabel(i), &eachWidth[i], &eachHeight[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 = GetNumVer() * (maxHeight + charHeight/2) + charHeight*3/2;
-       totWidth  = GetNumHor() * (maxWidth + charWidth) + charWidth;
+       totHeight = GetRowCount() * (maxHeight + charHeight/2) + charHeight*3/2;
+       totWidth  = GetColumnCount() * (maxWidth + charWidth) + charWidth;
+
+    // only change our width/height if asked for
+    if ( width == -1 )
+    {
+        if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+            width = totWidth ;
+        else
+            width = widthOld;
+    }
+
+    if ( height == -1 )
+    {
+        if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+            height = totHeight ;
+        else
+            height = heightOld;
+    }
 
-       wxControl::DoSetSize(x_offset,y_offset,totWidth,totHeight);
+       wxControl::DoSetSize(x_offset,y_offset,width,height,wxSIZE_AUTO);
 
 // arrange radiobuttons
 
@@ -472,7 +451,7 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
        
        
        x_start = charWidth;
-       y_start = charHeight*3/2;
+       y_start = 15 ;
        x_offset = x_start;
        y_offset = y_start;
        
@@ -489,7 +468,7 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                else
                        {
                                x_offset = x_start;
-                       y_offset += maxHeight + charHeight/2;
+                       y_offset += maxHeight ; /*+ charHeight/2;*/
                                }
                        }
 
@@ -497,18 +476,53 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                current=current->NextInCycle();
                
                if (m_windowStyle & wxRA_SPECIFY_ROWS)
-                       y_offset += maxHeight + charHeight/2;
+                       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(wxString("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);
+        eachWidth  = (int)(eachWidth + RADIO_SIZE) ;
+        eachHeight = (int)((3 * eachHeight) / 2);
+        if (maxWidth < eachWidth)     maxWidth = eachWidth;
+        if (maxHeight < eachHeight)   maxHeight = eachHeight;
+    }
+
+    totHeight = GetRowCount() * (maxHeight + charHeight/2) + charHeight * 3/2;
+    totWidth  = GetColumnCount() * (maxWidth + charWidth) + charWidth;
+
+    // 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
 //-------------------------------------------------------------------------------------
 // return the number of buttons in the vertical direction
 
-int wxRadioBox::GetNumVer() const
+int wxRadioBox::GetRowCount() const
 {
     if ( m_windowStyle & wxRA_SPECIFY_ROWS )
     {
@@ -525,7 +539,7 @@ int wxRadioBox::GetNumVer() const
 //-------------------------------------------------------------------------------------
 // return the number of buttons in the horizontal direction
 
-int wxRadioBox::GetNumHor() const
+int wxRadioBox::GetColumnCount() const
 {
     if ( m_windowStyle & wxRA_SPECIFY_ROWS )
     {