X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8208e181cb576ec6cda37624923f95a59af43072..a85245b1c2c2b3f49658b2b49f3cbfc5ff9efdd4:/src/mac/carbon/radiobox.cpp diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index 416ba0b18f..e2799918b4 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -1,34 +1,55 @@ ///////////////////////////////////////////////////////////////////////////// // Name: radiobox.cpp // Purpose: wxRadioBox -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: JS Lair (99/11/15) first implementation -// Created: ??/??/98 +// Created: 1998-01-01 // 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 +#include "wx/radiobut.h" +#include "wx/mac/uma.h" IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) -#pragma mark - -#pragma mark ### Constructors & destructor ### - //------------------------------------------------------------------------------------- -// ¥ wxRadioBox() +// ¥ wxRadioBox() //------------------------------------------------------------------------------------- // 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() { @@ -39,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 // @@ -49,37 +70,56 @@ wxRadioBox::wxRadioBox() // //------------------------------------------------------------------------------------- -// ¥ ~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) { - 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, - 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; - + m_noItems = n; m_noRowsOrCols = majorDim; m_radioButtonCycle = NULL; @@ -90,97 +130,87 @@ 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_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_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, - kControlGroupBoxTextTitleProc , (long) this ) ; - - MacPostControlCreate() ; + 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(),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) { - int i; + int i; wxRadioButton *current; - + if (!wxControl::Enable(enable)) - return (false); + return false; - current=m_radioButtonCycle; - for (i=0;iEnable(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 -void wxRadioBox::Enable(int item, bool enable) +bool 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(); - } -} + 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 @@ -190,28 +220,29 @@ wxString wxRadioBox::GetLabel() const } //------------------------------------------------------------------------------------- -// ¥ GetLabel(int) +// ¥ GetLabel(int) //------------------------------------------------------------------------------------- // 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++; - current=current->NextInCycle(); - } + + if (!IsValid(item)) + return wxEmptyString; + + i = 0; + current = m_radioButtonCycle; + while (i != item) { + i++; + current = current->NextInCycle(); + } return current->GetLabel(); } //------------------------------------------------------------------------------------- -// ¥ GetSelection +// ¥ GetSelection //------------------------------------------------------------------------------------- // Returns the zero-based position of the selected button @@ -219,44 +250,19 @@ int wxRadioBox::GetSelection() const { int i; wxRadioButton *current; - + i=0; current=m_radioButtonCycle; while (!current->GetValue()) { - i++; - current=current->NextInCycle(); - } + i++; + current=current->NextInCycle(); + } 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 // @@ -264,7 +270,7 @@ wxString wxRadioBox::GetStringSelection () const // //------------------------------------------------------------------------------------- -// ¥ SetLabel(const wxString&) +// ¥ SetLabel(const wxString&) //------------------------------------------------------------------------------------- // Sets the radiobox label @@ -274,113 +280,93 @@ void wxRadioBox::SetLabel(const wxString& label) } //------------------------------------------------------------------------------------- -// ¥ SetLabel(int, const wxString&) +// ¥ SetLabel(int, const wxString&) //------------------------------------------------------------------------------------- // 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; - - if ((item < 0) || (item >= m_noItems)) + + if (!IsValid(item)) return; - i=0; + i=0; current=m_radioButtonCycle; while (i!=item) { - i++; - current=current->NextInCycle(); - } + i++; + current=current->NextInCycle(); + } 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; - - if ((item < 0) || (item >= m_noItems)) + + if (!IsValid(item)) return; i=0; current=m_radioButtonCycle; while (i!=item) { - i++; - current=current->NextInCycle(); - } + i++; + current=current->NextInCycle(); + } 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; - + wxControl::Show(show); current=m_radioButtonCycle; - for (i=0;iShow(show); - current=current->NextInCycle(); - } + for (i=0;iShow(show); + current=current->NextInCycle(); + } 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; - - 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); + 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 @@ -391,7 +377,7 @@ void wxRadioBox::Command (wxCommandEvent & event) } //------------------------------------------------------------------------------------- -// ¥ SetFocus +// ¥ SetFocus //------------------------------------------------------------------------------------- // Sets the selected button to receive keyboard input @@ -399,134 +385,174 @@ void wxRadioBox::SetFocus() { int i; wxRadioButton *current; - + 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 -#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; + 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; - SetFont(GetParent()->GetFont()); - GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight); - charWidth/=52; + 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 (maxWidthSetSize(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; - } + 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 -int wxRadioBox::GetNumVer() const +int wxRadioBox::GetRowCount() const { if ( m_windowStyle & wxRA_SPECIFY_ROWS ) { @@ -539,11 +565,11 @@ int wxRadioBox::GetNumVer() const } //------------------------------------------------------------------------------------- -// ¥ GetNumHor +// ¥ GetNumHor //------------------------------------------------------------------------------------- // return the number of buttons in the horizontal direction -int wxRadioBox::GetNumHor() const +int wxRadioBox::GetColumnCount() const { if ( m_windowStyle & wxRA_SPECIFY_ROWS ) { @@ -555,7 +581,4 @@ int wxRadioBox::GetNumHor() const } } - - - - +#endif