X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5008c64c321c39b498bbe5fb7f8bcc667cd41fe2..204abcd474fa99071b7bb5b00f7e212b0bde16dc:/src/mac/carbon/radiobox.cpp diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index 492c93133a..69ce082c1b 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -1,544 +1,527 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: radiobox.cpp +// Name: src/mac/carbon/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 ///////////////////////////////////////////////////////////////////////////// -//------------------------------------------------------------------------------------- -// headers -//------------------------------------------------------------------------------------- +#include "wx/wxprec.h" -#ifdef __GNUG__ -#pragma implementation "radiobox.h" -#endif +#if wxUSE_RADIOBOX #include "wx/radiobox.h" -#include -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) +#ifndef WX_PRECOMP + #include "wx/radiobut.h" + #include "wx/arrstr.h" #endif -#pragma mark - -#pragma mark ### Constructors & destructor ### +#include "wx/mac/uma.h" + +IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) + -//------------------------------------------------------------------------------------- -// ¥ 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() { 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() { - wxRadioButton *next,*current; - - current=m_radioButtonCycle->NextInCycle(); - next=current->NextInCycle(); - while (current!=m_radioButtonCycle) { - delete current; - current=next; - next=current->NextInCycle(); - } - delete current; + m_isBeingDeleted = true; + + wxRadioButton *next, *current; + + current = m_radioButtonCycle->NextInCycle(); + if (current != NULL) + { + while (current != m_radioButtonCycle) + { + next = current->NextInCycle(); + delete current; + + current = next; + } + + 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 ; + SetMajorDim( majorDim == 0 ? n : majorDim, style ); + m_labelOrig = m_label = label; - Rect bounds ; - Str255 title ; - - MacPreControlCreate( parent , id , label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ; + 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 ); + + 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(),choices[i],wxPoint(5,20*i+10)); - m_radioButtonCycle=radBtn->AddInCycle(m_radioButtonCycle); + 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 ); } - 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) -//------------------------------------------------------------------------------------- // Enables or disables the entire radiobox - +// bool wxRadioBox::Enable(bool enable) { - int i; wxRadioButton *current; - - if (!wxControl::Enable(enable)) - return (false); - - current=m_radioButtonCycle; - for (i=0;iEnable(enable); - current=current->NextInCycle(); - } - return (true); + + if (!wxControl::Enable( enable )) + return false; + + current = m_radioButtonCycle; + 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 - -void wxRadioBox::Enable(int item, bool enable) +// +bool wxRadioBox::Enable(unsigned int item, bool enable) { - 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; + unsigned int i = 0; + wxRadioButton *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 + return current->Enable( enable ); +} -int wxRadioBox::FindString(const wxString& s) const +bool wxRadioBox::IsItemEnabled(unsigned int item) const { - int i; - wxRadioButton *current; - - current=m_radioButtonCycle; - for (i = 0; i < m_noItems; i++) + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) { - if (s == current->GetLabel()) - return i; - current=current->NextInCycle(); + i++; + current = current->NextInCycle(); } - return -1; + + 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::GetLabel(int item) const +// +wxString wxRadioBox::GetString(unsigned int item) const { - 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; + + unsigned int i = 0; + current = m_radioButtonCycle; + 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++; - current=current->NextInCycle(); - } - - return i; -} - -//------------------------------------------------------------------------------------- -// ¥ GetString -//------------------------------------------------------------------------------------- -// Find string for position -wxString wxRadioBox::GetString(int item) const -{ - - return GetLabel(item); -} - -//------------------------------------------------------------------------------------- -// ¥ GetStringSelection -//------------------------------------------------------------------------------------- -// Returns the selected string + i = 0; + current = m_radioButtonCycle; + while (!current->GetValue()) + { + i++; + current = current->NextInCycle(); + } -wxString wxRadioBox::GetStringSelection () const -{ - int sel = GetSelection (); - if (sel > -1) - return this->GetString (sel); - else - return wxString(""); + 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::SetLabel(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) { - i++; - current=current->NextInCycle(); - } - return current->SetLabel(label); + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + 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)) - return; - i=0; - current=m_radioButtonCycle; - while (i!=item) { - 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 + if (!IsValid( item )) + return; -bool wxRadioBox::SetStringSelection (const wxString& s) -{ - int sel = FindString (s); - if (sel > -1) + i = 0; + current = m_radioButtonCycle; + while (i != item) { - SetSelection (sel); - return TRUE; + i++; + current = current->NextInCycle(); } - else - return FALSE; -} -//------------------------------------------------------------------------------------- -// ¥ 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; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } -void wxRadioBox::Show(int item, bool show) + 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) { - i++; - current=current->NextInCycle(); - } - current->Show(show); + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + 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->SetFocus(); -} + current = m_radioButtonCycle; + while (!current->GetValue()) + { + current = current->NextInCycle(); + } -#pragma mark - -#pragma mark ### Internal functions ### + current->SetFocus(); +} -//------------------------------------------------------------------------------------- -// ¥ 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; - - 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; - -// define size - - int charWidth,charHeight; - int maxWidth,maxHeight; - int eachWidth[128],eachHeight[128]; - int totWidth,totHeight; - - SetFont(GetParent()->GetFont()); - GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight); - charWidth/=52; - - maxWidth=-1; - maxHeight=-1; - for (i = 0 ; i < m_noItems; i++) - { - GetTextExtent(GetLabel(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; - } -} + int i; + wxRadioButton *current; -//------------------------------------------------------------------------------------- -// ¥ GetNumVer -//------------------------------------------------------------------------------------- -// return the number of buttons in the vertical direction + // define the position -int wxRadioBox::GetNumVer() const -{ - if ( m_windowStyle & wxRA_SPECIFY_ROWS ) + int x_current, y_current; + int x_offset, y_offset; + int widthOld, heightOld; + + GetSize( &widthOld, &heightOld ); + GetPosition( &x_current, &y_current ); + + x_offset = x; + y_offset = y; + if (!(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) { - return m_majorDim; + if (x == wxDefaultCoord) + x_offset = x_current; + if (y == wxDefaultCoord) + y_offset = y_current; } - else + + // define size + 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++) { - return (m_noItems + m_majorDim - 1)/m_majorDim; + 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]; } -} -//------------------------------------------------------------------------------------- -// ¥ GetNumHor -//------------------------------------------------------------------------------------- -// return the number of buttons in the horizontal direction + totHeight = GetRowCount() * maxHeight; + totWidth = GetColumnCount() * (maxWidth + charWidth); -int wxRadioBox::GetNumHor() const -{ - if ( m_windowStyle & wxRA_SPECIFY_ROWS ) + wxSize sz = DoGetSizeFromClientSize( wxSize( totWidth, totHeight ) ) ; + + // change the width / height only when specified + if ( width == wxDefaultCoord ) + { + if ( sizeFlags & wxSIZE_AUTO_WIDTH ) + width = sz.x; + else + width = widthOld; + } + + if ( height == wxDefaultCoord ) { - return (m_noItems + m_majorDim - 1)/m_majorDim; + if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) + height = sz.y; + else + height = heightOld; } - else + + wxControl::DoSetSize( x_offset, y_offset, width, height, wxSIZE_AUTO ); + + // arrange radio buttons + 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 < (int)m_noItems; i++) { - return m_majorDim; + // not to do for the zero button! + if ((i > 0) && ((i % GetMajorDim()) == 0)) + { + 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 = GetFont(); // GetParent()->GetFont() + GetTextExtent( + wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), + &charWidth, &charHeight, NULL, NULL, &font ); + + charWidth /= 52; + maxWidth = -1; + maxHeight = -1; + for (unsigned 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( GetLabel(), &eachWidth, NULL ); + eachWidth = (int)(eachWidth + RADIO_SIZE) + 3 * charWidth; + if (totWidth < eachWidth) + totWidth = eachWidth; + + return wxSize( totWidth, totHeight ); +} +#endif // wxUSE_RADIOBOX