X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e75491071dbefcada61175e3eb89ce4edf335983..8786868c1bcc78b58df7dded6dc589a0e4a29a21:/src/mac/carbon/radiobox.cpp diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index b1f4dbf615..da6e258868 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -1,179 +1,494 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: radiobox.cpp +// Name: src/mac/carbon/radiobox.cpp // Purpose: wxRadioBox -// Author: AUTHOR -// Modified by: -// Created: ??/??/98 +// Author: Stefan Csomor +// Modified by: JS Lair (99/11/15) first implementation +// Created: 1998-01-01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "radiobox.h" -#endif +#include "wx/wxprec.h" + +#if wxUSE_RADIOBOX #include "wx/radiobox.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) +#ifndef WX_PRECOMP + #include "wx/radiobut.h" + #include "wx/arrstr.h" #endif -// Radio box item +#include "wx/mac/uma.h" + +IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) + + +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_selectedButton = -1; m_noItems = 0; m_noRowsOrCols = 0; - m_majorDim = 0 ; + m_radioButtonCycle = NULL; +} + +wxRadioBox::~wxRadioBox() +{ + 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; + } } -bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, - const wxPoint& pos, const wxSize& size, - int n, const wxString choices[], - int majorDim, long style, - const wxValidator& val, const wxString& name) +// 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 ) { - m_selectedButton = -1; - m_noItems = n; + wxCArrayString chs(choices); - SetName(name); - SetValidator(val); + return Create( + parent, id, label, pos, size, chs.GetCount(), + chs.GetStrings(), majorDim, style, val, name); +} - parent->AddChild(this); +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 ; - m_windowStyle = (long&)style; + if ( !wxControl::Create( parent, id, pos, size, style, val, name ) ) + return false; - if (id == -1) - m_windowId = NewControlId(); - else - m_windowId = id; + int i; + 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_label = label; - // TODO create radiobox - return FALSE; -} + 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 ); -wxRadioBox::~wxRadioBox() -{ - // TODO -} + OSStatus err = CreateGroupBoxControl( + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), + &bounds, CFSTR("") , true /*primary*/, + m_peer->GetControlRefAddr() ); + verify_noerr( err ); -int wxRadioBox::FindString(const wxString& s) const -{ - // TODO - return -1; -} + for (i = 0; i < n; i++) + { + 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 ); + } -void wxRadioBox::SetSelection(int n) -{ - if ((n < 0) || (n >= m_noItems)) - return; - // TODO + SetSelection( 0 ); + MacPostControlCreate( pos, size ); - m_selectedButton = n; + return true; } -// Get single selection, for single choice list items -int wxRadioBox::GetSelection() const +// Enables or disables the entire radiobox +// +bool wxRadioBox::Enable(bool enable) { - return m_selectedButton; + wxRadioButton *current; + + 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; } -// Find string for position -wxString wxRadioBox::GetString(int n) const +// Enables or disables an given button +// +bool wxRadioBox::Enable(unsigned int item, bool enable) { - // TODO - return wxString(""); + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + return current->Enable( enable ); } -void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) +// Returns the radiobox label +// +wxString wxRadioBox::GetLabel() const { - wxControl::DoSetSize( x , y , width , height , sizeFlags ) ; + return wxControl::GetLabel(); } -void wxRadioBox::GetSize(int *width, int *height) const +// Returns the label for the given button +// +wxString wxRadioBox::GetString(unsigned int item) const { - wxControl::GetSize( width , height ) ; + wxRadioButton *current; + + if (!IsValid( item )) + return wxEmptyString; + + unsigned int i = 0; + current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + return current->GetLabel(); } -void wxRadioBox::GetPosition(int *x, int *y) const +// Returns the zero-based position of the selected button +// +int wxRadioBox::GetSelection() const { - wxControl::GetPosition( x , y ) ; + int i; + wxRadioButton *current; + + i = 0; + current = m_radioButtonCycle; + while (!current->GetValue()) + { + i++; + current = current->NextInCycle(); + } + + return i; } -wxString wxRadioBox::GetLabel( int item ) const +// Sets the radiobox label +// +void wxRadioBox::SetLabel(const wxString& label) { - // TODO - return wxString(""); + return wxControl::SetLabel( label ); } -void wxRadioBox::SetLabel(int item , const wxString& label) +// Sets the label of a given button +// +void wxRadioBox::SetString(unsigned int item,const wxString& label) { - // TODO + if (!IsValid( item )) + return; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + return current->SetLabel( label ); } -void wxRadioBox::SetFocus() +// 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) { - // TODO + int i; + wxRadioButton *current; + + if (!IsValid( item )) + return; + + i = 0; + current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + current->SetValue( true ); } +// Shows or hides the entire radiobox +// bool wxRadioBox::Show(bool show) { - return wxControl::Show( show ) ; -} + wxRadioButton *current; -// Enable a specific button -void wxRadioBox::Enable(int item, bool enable) -{ + current = m_radioButtonCycle; + for (unsigned int i=0; iShow( show ); + current = current->NextInCycle(); + } + + wxControl::Show( show ); + + return true; } -// Enable all controls -bool wxRadioBox::Enable(bool enable) +// Shows or hides the given button +// +bool wxRadioBox::Show(unsigned int item, bool show) { - return wxControl::Enable(enable); + if (!IsValid( item )) + return false; + + unsigned int i = 0; + wxRadioButton *current = m_radioButtonCycle; + while (i != item) + { + i++; + current = current->NextInCycle(); + } + + return current->Show( show ); } -// Show a specific button -void wxRadioBox::Show(int item, bool show) +// Simulates the effect of the user issuing a command to the item +// +void wxRadioBox::Command( wxCommandEvent& event ) { - // TODO + SetSelection( event.GetInt() ); + ProcessCommand( event ); } -// For single selection items only -wxString wxRadioBox::GetStringSelection () const +// Sets the selected button to receive keyboard input +// +void wxRadioBox::SetFocus() { - int sel = GetSelection (); - if (sel > -1) - return this->GetString (sel); - else - return wxString(""); + wxRadioButton *current; + + current = m_radioButtonCycle; + while (!current->GetValue()) + { + current = current->NextInCycle(); + } + + current->SetFocus(); } -bool wxRadioBox::SetStringSelection (const wxString& s) +// 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 sel = FindString (s); - if (sel > -1) + int i; + wxRadioButton *current; + + // define the position + + 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)) + { + 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; + + 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] ); + 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 = GetRowCount() * maxHeight; + totWidth = GetColumnCount() * (maxWidth + charWidth); + + 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 ) { - SetSelection (sel); - return TRUE; + if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) + height = sz.y; + else + height = heightOld; + } + + 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++) + { + // 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; } - else - return FALSE; } -void wxRadioBox::Command (wxCommandEvent & event) +wxSize wxRadioBox::DoGetBestSize() const { - SetSelection (event.m_commandInt); - ProcessCommand (event); -} + 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