X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/140f2012cdfdadb7e622e3b52339e521fa4a67a6..6cef0db28018fd2644ee4e38af715872e5242459:/src/mac/carbon/radiobox.cpp diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index f7874dd099..69ce082c1b 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -1,52 +1,43 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: radiobox.cpp +// Name: src/mac/carbon/radiobox.cpp // Purpose: wxRadioBox // Author: Stefan Csomor // Modified by: JS Lair (99/11/15) first implementation // Created: 1998-01-01 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "radioboxbase.h" -#pragma implementation "radiobox.h" -#endif - -//------------------------------------------------------------------------------------- -// headers -//------------------------------------------------------------------------------------- +#include "wx/wxprec.h" -#include "wx/defs.h" +#if wxUSE_RADIOBOX #include "wx/radiobox.h" -#include "wx/radiobut.h" + +#ifndef WX_PRECOMP + #include "wx/radiobut.h" + #include "wx/arrstr.h" +#endif + #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 ) { if ( outer.IsChecked() ) { - wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId); + wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId ); int i = GetSelection() ; - event.SetInt( i ); - event.SetString( GetString( i ) ); + event.SetInt(i); + event.SetString(GetString(i)); event.SetEventObject( this ); ProcessCommand(event); } @@ -56,413 +47,418 @@ 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, -// const wxValidator&, const wxString&) -//------------------------------------------------------------------------------------- -// Contructor, creating and showing a radiobox -// -// inline defined -// - -//------------------------------------------------------------------------------------- -// ¥ ~wxRadioBox -//------------------------------------------------------------------------------------- -// Destructor, destroying the radiobox item - wxRadioBox::~wxRadioBox() { - m_isBeingDeleted = TRUE; + m_isBeingDeleted = true; + + wxRadioButton *next, *current; + + current = m_radioButtonCycle->NextInCycle(); + if (current != NULL) + { + while (current != m_radioButtonCycle) + { + next = current->NextInCycle(); + delete current; + + current = next; + } - wxRadioButton *next,*current; - - current=m_radioButtonCycle->NextInCycle(); - next=current->NextInCycle(); - while (current!=m_radioButtonCycle) { delete current; - current=next; - next=current->NextInCycle(); } - delete current; } -//------------------------------------------------------------------------------------- -// ¥ Create -//------------------------------------------------------------------------------------- // 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) +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_noItems = (unsigned int)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_labelOrig = 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 ); + + OSStatus err = CreateGroupBoxControl( + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), + &bounds, CFSTR("") , true /*primary*/, + m_peer->GetControlRefAddr() ); + verify_noerr( err ); + 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, + GetLabelText(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); + m_radioButtonCycle = radBtn; +// m_radioButtonCycle = radBtn->AddInCycle( m_radioButtonCycle ); } - - SetSelection(0); - MacPostControlCreate() ; - - return TRUE; -} + SetSelection( 0 ); + MacPostControlCreate( pos, size ); -#pragma mark - -#pragma mark ### Specific functions (reference v2) ### + return true; +} -//------------------------------------------------------------------------------------- -// ¥ Enable(bool) -//------------------------------------------------------------------------------------- // Enables or disables the entire radiobox - +// bool wxRadioBox::Enable(bool enable) { - int i; wxRadioButton *current; - - if (!wxControl::Enable(enable)) + + if (!wxControl::Enable( enable )) return false; - + current = m_radioButtonCycle; - for (i = 0; i < m_noItems; i++) { - current->Enable(enable); + for (unsigned int i = 0; i < m_noItems; i++) + { + current->Enable( enable ); current = current->NextInCycle(); } + return true; } -//------------------------------------------------------------------------------------- -// ¥ Enable(int, bool) -//------------------------------------------------------------------------------------- // Enables or disables an given button +// +bool wxRadioBox::Enable(unsigned int item, bool enable) +{ + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } -void wxRadioBox::Enable(int item, bool enable) + return current->Enable( enable ); +} + +bool wxRadioBox::IsItemEnabled(unsigned int item) const { - int i; - wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) - return; - - i = 0; - current = m_radioButtonCycle; - while (i != item) { + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { i++; current = current->NextInCycle(); } - current->Enable(enable); + + return current->IsEnabled(); } -//------------------------------------------------------------------------------------- -// ¥ GetLabel() -//------------------------------------------------------------------------------------- // Returns the radiobox label - +// wxString wxRadioBox::GetLabel() const { return wxControl::GetLabel(); } -//------------------------------------------------------------------------------------- -// ¥ GetLabel(int) -//------------------------------------------------------------------------------------- // Returns the label for the given button - -wxString wxRadioBox::GetString(int item) const +// +wxString wxRadioBox::GetString(unsigned int item) const { - int i; wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) + + if (!IsValid( item )) return wxEmptyString; - - i = 0; + + unsigned int i = 0; current = m_radioButtonCycle; - while (i != item) { + while (i != item) + { i++; current = current->NextInCycle(); } + return current->GetLabel(); } -//------------------------------------------------------------------------------------- -// ¥ GetSelection -//------------------------------------------------------------------------------------- // Returns the zero-based position of the selected button - +// int wxRadioBox::GetSelection() const { 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 = current->NextInCycle(); } - + return i; } -//------------------------------------------------------------------------------------- -// ¥ Number -//------------------------------------------------------------------------------------- -// Returns the number of buttons in the radiobox -// -// inline defined -// - -//------------------------------------------------------------------------------------- -// ¥ SetLabel(const wxString&) -//------------------------------------------------------------------------------------- // Sets the radiobox label - +// void wxRadioBox::SetLabel(const wxString& label) { - return wxControl::SetLabel(label); + return wxControl::SetLabel( label ); } -//------------------------------------------------------------------------------------- -// ¥ SetLabel(int, const wxString&) -//------------------------------------------------------------------------------------- // Sets the label of a given button - -void wxRadioBox::SetString(int item,const wxString& label) +// +void wxRadioBox::SetString(unsigned int item,const wxString& label) { - int i; - wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) + if (!IsValid( item )) return; - i=0; - current=m_radioButtonCycle; - while (i!=item) { + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { i++; - current=current->NextInCycle(); + current = current->NextInCycle(); } - return current->SetLabel(label); + + return current->SetLabel( 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; - while (i!=item) { + + i = 0; + current = m_radioButtonCycle; + while (i != item) + { i++; - current=current->NextInCycle(); + current = current->NextInCycle(); } - current->SetValue(true); - -} -//------------------------------------------------------------------------------------- -// ¥ Show(bool) -//------------------------------------------------------------------------------------- -// Shows or hides the entire radiobox + current->SetValue( true ); +} +// 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(); + + current = m_radioButtonCycle; + for (unsigned int i=0; iShow( show ); + current = current->NextInCycle(); } + + wxControl::Show( show ); + return true; } -//------------------------------------------------------------------------------------- -// ¥ Show(int, bool) -//------------------------------------------------------------------------------------- -// Shows or hides the given button +// Shows or hides the given button +// +bool wxRadioBox::Show(unsigned int item, bool show) +{ + if (!IsValid( item )) + return false; -void wxRadioBox::Show(int item, bool show) + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + return current->Show( show ); +} + +bool wxRadioBox::IsItemShown(unsigned int item) const { - int i; - wxRadioButton *current; - - if ((item < 0) || (item >= m_noItems)) - return; - i=0; - current=m_radioButtonCycle; - while (i!=item) { + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { i++; - current=current->NextInCycle(); + current = current->NextInCycle(); } - current->Show(show); + + return current->IsShown(); } -#pragma mark - -#pragma mark ### Other external functions ### -//------------------------------------------------------------------------------------- -// ¥ Command -//------------------------------------------------------------------------------------- // Simulates the effect of the user issuing a command to the item - -void wxRadioBox::Command (wxCommandEvent & event) +// +void wxRadioBox::Command( wxCommandEvent& event ) { - SetSelection (event.GetInt()); - ProcessCommand (event); + SetSelection( event.GetInt() ); + ProcessCommand( event ); } -//------------------------------------------------------------------------------------- -// ¥ SetFocus -//------------------------------------------------------------------------------------- // Sets the selected button to receive keyboard input - +// void wxRadioBox::SetFocus() { - int i; wxRadioButton *current; - - i=0; - current=m_radioButtonCycle; - while (!current->GetValue()) { - i++; - current=current->NextInCycle(); + + current = m_radioButtonCycle; + while (!current->GetValue()) + { + current = current->NextInCycle(); } + current->SetFocus(); } - -#pragma mark - -#pragma mark ### Internal functions ### - -//------------------------------------------------------------------------------------- -// ¥ DoSetSize -//------------------------------------------------------------------------------------- // Simulates the effect of the user issuing a command to the item - +// #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 x_offset, y_offset; int widthOld, heightOld; - GetSize(&widthOld, &heightOld); - + + GetSize( &widthOld, &heightOld ); + GetPosition( &x_current, &y_current ); + 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; - + if (!(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + { + if (x == wxDefaultCoord) + x_offset = x_current; + if (y == wxDefaultCoord) + y_offset = y_current; + } + // define size - - int charWidth,charHeight; - int maxWidth,maxHeight; - int eachWidth[128],eachHeight[128]; - int totWidth,totHeight; - - SetFont(GetParent()->GetFont()); - GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight); - charWidth/=52; - - maxWidth=-1; - maxHeight=-1; - for (i = 0 ; i < m_noItems; i++) + int charWidth, charHeight; + int maxWidth, maxHeight; + int eachWidth[128], eachHeight[128]; + int totWidth, totHeight; + + GetTextExtent( + wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), + &charWidth, &charHeight ); + + charWidth /= 52; + + maxWidth = -1; + maxHeight = -1; + for (unsigned int i = 0 ; i < m_noItems; i++) { - GetTextExtent(GetString(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 0) && ((i % GetMajorDim()) == 0)) { - if (m_windowStyle & wxRA_VERTICAL) + if (m_windowStyle & wxRA_SPECIFY_ROWS) { x_offset += maxWidth + charWidth; y_offset = y_start; @@ -470,15 +466,15 @@ 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 } } - - current->SetSize(x_offset,y_offset,eachWidth[i],eachHeight[i]); - current=current->NextInCycle(); - + + current->SetSize( x_offset, y_offset, eachWidth[i], eachHeight[i]); + current = current->NextInCycle(); + if (m_windowStyle & wxRA_SPECIFY_ROWS) - y_offset += maxHeight ; /*+ charHeight/2;*/ + y_offset += maxHeight ; // + charHeight / 2 else x_offset += maxWidth + charWidth; } @@ -490,70 +486,42 @@ wxSize wxRadioBox::DoGetBestSize() const int maxWidth, maxHeight; int eachWidth, eachHeight; int totWidth, totHeight; - - wxFont font = GetParent()->GetFont(); - GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), - &charWidth, &charHeight, NULL, NULL, &font); + + wxFont font = GetFont(); // 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); - 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 ; - 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::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 + for (unsigned int i = 0 ; i < m_noItems; i++) { - return m_majorDim; + 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( GetLabel(), &eachWidth, NULL ); + eachWidth = (int)(eachWidth + RADIO_SIZE) + 3 * charWidth; + if (totWidth < eachWidth) + totWidth = eachWidth; + return wxSize( totWidth, totHeight ); +} +#endif // wxUSE_RADIOBOX