X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..78606adf3a792c767d6498882e81547990180c96:/src/mac/carbon/radiobox.cpp diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index 15ac067af7..685ce0a654 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: radiobox.cpp +// Name: src/mac/carbon/radiobox.cpp // Purpose: wxRadioBox // Author: Stefan Csomor // Modified by: JS Lair (99/11/15) first implementation @@ -9,34 +9,28 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "radioboxbase.h" -#pragma implementation "radiobox.h" -#endif - //------------------------------------------------------------------------------------- // headers //------------------------------------------------------------------------------------- -#include "wx/defs.h" +#include "wx/wxprec.h" + +#if wxUSE_RADIOBOX + +#include "wx/arrstr.h" #include "wx/radiobox.h" #include "wx/radiobut.h" #include "wx/mac/uma.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) -#endif - -#pragma mark - -#pragma mark ### Constructors & destructor ### //------------------------------------------------------------------------------------- // ¥ wxRadioBox() //------------------------------------------------------------------------------------- // Default constructor BEGIN_EVENT_TABLE(wxRadioBox, wxControl) -EVT_RADIOBUTTON( -1 , wxRadioBox::OnRadioButton ) +EVT_RADIOBUTTON( wxID_ANY , wxRadioBox::OnRadioButton ) END_EVENT_TABLE() void wxRadioBox::OnRadioButton( wxCommandEvent &outer ) @@ -56,13 +50,12 @@ wxRadioBox::wxRadioBox() { m_noItems = 0; m_noRowsOrCols = 0; - m_majorDim = 0 ; m_radioButtonCycle = NULL; } //------------------------------------------------------------------------------------- -// ¥ wxRadioBox(wxWindow*, wxWindowID, const wxString&, const wxPoint&, -// const wxSize&, int, const wxString[], int, long, +// ¥ wxRadioBox(wxWindow*, wxWindowID, const wxString&, const wxPoint&, +// const wxSize&, int, const wxString[], int, long, // const wxValidator&, const wxString&) //------------------------------------------------------------------------------------- // Contructor, creating and showing a radiobox @@ -77,8 +70,10 @@ wxRadioBox::wxRadioBox() wxRadioBox::~wxRadioBox() { + m_isBeingDeleted = true; + wxRadioButton *next,*current; - + current=m_radioButtonCycle->NextInCycle(); next=current->NextInCycle(); while (current!=m_radioButtonCycle) { @@ -86,7 +81,7 @@ wxRadioBox::~wxRadioBox() current=next; next=current->NextInCycle(); } - delete current; + delete current; } //------------------------------------------------------------------------------------- @@ -94,50 +89,72 @@ wxRadioBox::~wxRadioBox() //------------------------------------------------------------------------------------- // Create the radiobox for two-step construction +bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label, + 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; - + m_noItems = n; m_noRowsOrCols = majorDim; m_radioButtonCycle = NULL; - - if (majorDim==0) - m_majorDim = n ; - else - m_majorDim = majorDim ; - - - 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 ) ; - + + SetMajorDim(majorDim == 0 ? n : majorDim, style); + + 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) ; + + verify_noerr(CreateGroupBoxControl(MAC_WXHWND(parent->MacGetTopLevelWindowRef()),&bounds, CFSTR("") , + true /*primary*/ , m_peer->GetControlRefAddr() ) ) ; + for (i = 0; i < n; i++) { - wxRadioButton *radBtn = new wxRadioButton(this, NewControlId(), wxStripMenuCodes(choices[i]),wxPoint(5,20*i+10), - wxDefaultSize , i == 0 ? wxRB_GROUP : 0 ) ; + 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); - MacPostControlCreate() ; - - return TRUE; -} + MacPostControlCreate(pos,size) ; + return true; +} -#pragma mark - -#pragma mark ### Specific functions (reference v2) ### //------------------------------------------------------------------------------------- // ¥ Enable(bool) @@ -148,10 +165,10 @@ bool wxRadioBox::Enable(bool enable) { int i; wxRadioButton *current; - + if (!wxControl::Enable(enable)) return false; - + current = m_radioButtonCycle; for (i = 0; i < m_noItems; i++) { current->Enable(enable); @@ -165,21 +182,21 @@ bool wxRadioBox::Enable(bool enable) //------------------------------------------------------------------------------------- // Enables or disables an given button -void wxRadioBox::Enable(int item, bool enable) +bool wxRadioBox::Enable(int item, bool enable) { int i; wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) - return; - + + if (!IsValid(item)) + return false; + i = 0; current = m_radioButtonCycle; while (i != item) { i++; current = current->NextInCycle(); } - current->Enable(enable); + return current->Enable(enable); } //------------------------------------------------------------------------------------- @@ -201,10 +218,10 @@ wxString wxRadioBox::GetString(int item) const { int i; wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) - return wxString(""); - + + if (!IsValid(item)) + return wxEmptyString; + i = 0; current = m_radioButtonCycle; while (i != item) { @@ -223,14 +240,14 @@ int wxRadioBox::GetSelection() const { int i; wxRadioButton *current; - + i=0; current=m_radioButtonCycle; while (!current->GetValue()) { i++; current=current->NextInCycle(); } - + return i; } @@ -261,8 +278,8 @@ void wxRadioBox::SetString(int item,const wxString& label) { int i; wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) + + if (!IsValid(item)) return; i=0; current=m_radioButtonCycle; @@ -276,15 +293,15 @@ void wxRadioBox::SetString(int item,const wxString& label) //------------------------------------------------------------------------------------- // ¥ 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; - - if ((item < 0) || (item >= m_noItems)) + + if (!IsValid(item)) return; i=0; current=m_radioButtonCycle; @@ -293,23 +310,24 @@ void wxRadioBox::SetSelection(int item) current=current->NextInCycle(); } current->SetValue(true); - + } //------------------------------------------------------------------------------------- // ¥ Show(bool) //------------------------------------------------------------------------------------- -// Shows or hides the entire radiobox +// Shows or hides the entire radiobox bool wxRadioBox::Show(bool show) { int i; wxRadioButton *current; - + wxControl::Show(show); - + current=m_radioButtonCycle; - for (i=0;iShow(show); current=current->NextInCycle(); } @@ -319,27 +337,24 @@ bool wxRadioBox::Show(bool show) //------------------------------------------------------------------------------------- // ¥ 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; - - if ((item < 0) || (item >= m_noItems)) - return; + + if (!IsValid(item)) + return false; i=0; current=m_radioButtonCycle; while (i!=item) { i++; current=current->NextInCycle(); } - current->Show(show); + return current->Show(show); } -#pragma mark - -#pragma mark ### Other external functions ### - //------------------------------------------------------------------------------------- // ¥ Command //------------------------------------------------------------------------------------- @@ -360,7 +375,7 @@ void wxRadioBox::SetFocus() { int i; wxRadioButton *current; - + i=0; current=m_radioButtonCycle; while (!current->GetValue()) { @@ -371,47 +386,44 @@ void wxRadioBox::SetFocus() } -#pragma mark - -#pragma mark ### Internal functions ### - //------------------------------------------------------------------------------------- // ¥ DoSetSize //------------------------------------------------------------------------------------- // Simulates the effect of the user issuing a command to the item -#define RADIO_SIZE 40 +#define RADIO_SIZE 20 void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { int i; wxRadioButton *current; - + // define the position - + 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 == wxDefaultCoord) && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) x_offset = x_current; - if ((y == -1)&& !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + if ((y == wxDefaultCoord)&& !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) y_offset = y_current; - + // define size - + int charWidth,charHeight; int maxWidth,maxHeight; int eachWidth[128],eachHeight[128]; int totWidth,totHeight; - - SetFont(GetParent()->GetFont()); - GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight); + + GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight); + charWidth/=52; - + maxWidth=-1; maxHeight=-1; for (i = 0 ; i < m_noItems; i++) @@ -421,46 +433,49 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) eachHeight[i] = (int)((3*eachHeight[i])/2); if (maxWidthSetSize(x_offset,y_offset,eachWidth[i],eachHeight[i]); current=current->NextInCycle(); - + if (m_windowStyle & wxRA_SPECIFY_ROWS) y_offset += maxHeight ; /*+ charHeight/2;*/ else @@ -488,70 +503,39 @@ wxSize wxRadioBox::DoGetBestSize() const int maxWidth, maxHeight; int eachWidth, eachHeight; int totWidth, totHeight; - - wxFont font = GetParent()->GetFont(); - GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), + + 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); + 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 + charHeight/2) + charHeight * 3/2; - totWidth = GetColumnCount() * (maxWidth + charWidth) + charWidth; - + + 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); + GetTextExtent(GetLabel(), &eachWidth, NULL); eachWidth = (int)(eachWidth + RADIO_SIZE) + 3 * charWidth ; - if (totWidth < eachWidth) + if (totWidth < eachWidth) totWidth = eachWidth; - - return wxSize(totWidth, totHeight); -} -//------------------------------------------------------------------------------------- -// ¥ GetNumVer -//------------------------------------------------------------------------------------- -// return the number of buttons in the vertical direction - -int wxRadioBox::GetRowCount() const -{ - if ( m_windowStyle & wxRA_SPECIFY_ROWS ) - { - return m_majorDim; - } - else - { - return (m_noItems + m_majorDim - 1)/m_majorDim; - } -} -//------------------------------------------------------------------------------------- -// ¥ GetNumHor -//------------------------------------------------------------------------------------- -// return the number of buttons in the horizontal direction - -int wxRadioBox::GetColumnCount() const -{ - if ( m_windowStyle & wxRA_SPECIFY_ROWS ) - { - return (m_noItems + m_majorDim - 1)/m_majorDim; - } - else - { - return m_majorDim; - } + return wxSize(totWidth, totHeight); } - - - - +#endif