// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+#ifdef __GNUG__
+ #pragma implementation "radioboxbase.h"
+ #pragma implementation "radiobox.h"
+#endif
+
//-------------------------------------------------------------------------------------
// headers
//-------------------------------------------------------------------------------------
-#ifdef __GNUG__
-#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)
// ¥ 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()
{
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;
}
bool wxRadioBox::Enable(bool enable)
{
- int i;
+ int i;
wxRadioButton *current;
if (!wxControl::Enable(enable))
- return (false);
-
- current=m_radioButtonCycle;
- for (i=0;i<m_noItems;i++) {
+ return false;
+
+ current = m_radioButtonCycle;
+ for (i = 0; i < m_noItems; i++) {
current->Enable(enable);
- current=current->NextInCycle();
- }
- return (true);
+ current = current->NextInCycle();
+ }
+ return true;
}
//-------------------------------------------------------------------------------------
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();
- }
-}
-
-
-//-------------------------------------------------------------------------------------
-// ¥ 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);
}
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
// 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();
}
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
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
// 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;
}
-//-------------------------------------------------------------------------------------
-// ¥ 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)
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
// 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)
{
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
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;
- wxControl::DoSetSize(x_offset,y_offset,totWidth,totHeight,wxSIZE_AUTO);
+ // 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,width,height,wxSIZE_AUTO);
// arrange radiobuttons
x_start = charWidth;
- y_start = charHeight*3/2;
+ y_start = 15 ;
x_offset = x_start;
y_offset = y_start;
else
{
x_offset = x_start;
- y_offset += maxHeight + charHeight/2;
+ y_offset += maxHeight ; /*+ charHeight/2;*/
}
}
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 )
{
//-------------------------------------------------------------------------------------
// return the number of buttons in the horizontal direction
-int wxRadioBox::GetNumHor() const
+int wxRadioBox::GetColumnCount() const
{
if ( m_windowStyle & wxRA_SPECIFY_ROWS )
{