X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e75491071dbefcada61175e3eb89ce4edf335983..d109c5849ed117966311a44875c97ae3d77b44e5:/src/mac/carbon/radiobox.cpp diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index b1f4dbf615..3695edf6ca 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -1,179 +1,585 @@ ///////////////////////////////////////////////////////////////////////////// // Name: 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 "radioboxbase.h" #pragma implementation "radiobox.h" #endif +//------------------------------------------------------------------------------------- +// headers +//------------------------------------------------------------------------------------- + +#include "wx/defs.h" +#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 -// Radio box item +//------------------------------------------------------------------------------------- +// ¥ wxRadioBox() +//------------------------------------------------------------------------------------- +// Default constructor +BEGIN_EVENT_TABLE(wxRadioBox, wxControl) +EVT_RADIOBUTTON( -1 , 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; } -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) +//------------------------------------------------------------------------------------- +// ¥ 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_selectedButton = -1; - m_noItems = n; + 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; +} - SetName(name); - SetValidator(val); +//------------------------------------------------------------------------------------- +// ¥ Create +//------------------------------------------------------------------------------------- +// Create the radiobox for two-step construction - parent->AddChild(this); +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); - m_windowStyle = (long&)style; + return Create(parent, id, label, pos, size, chs.GetCount(), + chs.GetStrings(), majorDim, style, val, name); +} - if (id == -1) - m_windowId = NewControlId(); - else - m_windowId = id; +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 ; + + + 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() ; + + 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, + 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(pos,size) ; + + return TRUE; +} + +//------------------------------------------------------------------------------------- +// ¥ Enable(bool) +//------------------------------------------------------------------------------------- +// Enables or disables the entire radiobox - // TODO create radiobox - return FALSE; +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); + current = current->NextInCycle(); + } + return true; } +//------------------------------------------------------------------------------------- +// ¥ Enable(int, bool) +//------------------------------------------------------------------------------------- +// Enables or disables an given button -wxRadioBox::~wxRadioBox() +void wxRadioBox::Enable(int item, bool enable) { - // TODO + int i; + wxRadioButton *current; + + if ((item < 0) || (item >= m_noItems)) + return; + + i = 0; + current = m_radioButtonCycle; + while (i != item) { + i++; + current = current->NextInCycle(); + } + current->Enable(enable); } -int wxRadioBox::FindString(const wxString& s) const +//------------------------------------------------------------------------------------- +// ¥ GetLabel() +//------------------------------------------------------------------------------------- +// Returns the radiobox label + +wxString wxRadioBox::GetLabel() const { - // TODO - return -1; + return wxControl::GetLabel(); } -void wxRadioBox::SetSelection(int n) -{ - if ((n < 0) || (n >= m_noItems)) - return; - // TODO +//------------------------------------------------------------------------------------- +// ¥ GetLabel(int) +//------------------------------------------------------------------------------------- +// Returns the label for the given button - m_selectedButton = n; +wxString wxRadioBox::GetString(int item) const +{ + int i; + wxRadioButton *current; + + if ((item < 0) || (item >= m_noItems)) + return wxEmptyString; + + i = 0; + current = m_radioButtonCycle; + while (i != item) { + i++; + current = current->NextInCycle(); + } + return current->GetLabel(); } -// Get single selection, for single choice list items +//------------------------------------------------------------------------------------- +// ¥ GetSelection +//------------------------------------------------------------------------------------- +// Returns the zero-based position of the selected button + int wxRadioBox::GetSelection() const { - return m_selectedButton; + int i; + wxRadioButton *current; + + i=0; + current=m_radioButtonCycle; + while (!current->GetValue()) { + i++; + current=current->NextInCycle(); + } + + return i; } -// Find string for position -wxString wxRadioBox::GetString(int n) const +//------------------------------------------------------------------------------------- +// ¥ Number +//------------------------------------------------------------------------------------- +// Returns the number of buttons in the radiobox +// +// inline defined +// + +//------------------------------------------------------------------------------------- +// ¥ SetLabel(const wxString&) +//------------------------------------------------------------------------------------- +// Sets the radiobox label + +void wxRadioBox::SetLabel(const wxString& label) { - // TODO - return wxString(""); + return wxControl::SetLabel(label); } -void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) +//------------------------------------------------------------------------------------- +// ¥ SetLabel(int, const wxString&) +//------------------------------------------------------------------------------------- +// Sets the label of a given button + +void wxRadioBox::SetString(int item,const wxString& label) { - wxControl::DoSetSize( x , y , width , height , sizeFlags ) ; + int i; + wxRadioButton *current; + + if ((item < 0) || (item >= m_noItems)) + return; + i=0; + current=m_radioButtonCycle; + while (i!=item) { + i++; + current=current->NextInCycle(); + } + return current->SetLabel(label); } -void wxRadioBox::GetSize(int *width, int *height) const +//------------------------------------------------------------------------------------- +// ¥ SetSelection +//------------------------------------------------------------------------------------- +// 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) { - wxControl::GetSize( width , height ) ; + 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); + } -void wxRadioBox::GetPosition(int *x, int *y) const +//------------------------------------------------------------------------------------- +// ¥ Show(bool) +//------------------------------------------------------------------------------------- +// Shows or hides the entire radiobox + +bool wxRadioBox::Show(bool show) { - wxControl::GetPosition( x , y ) ; + int i; + wxRadioButton *current; + + wxControl::Show(show); + + current=m_radioButtonCycle; + for (i=0;iShow(show); + current=current->NextInCycle(); + } + return true; } -wxString wxRadioBox::GetLabel( int item ) const +//------------------------------------------------------------------------------------- +// ¥ Show(int, bool) +//------------------------------------------------------------------------------------- +// Shows or hides the given button + +void wxRadioBox::Show(int item, bool show) { - // TODO - return wxString(""); + 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); } -void wxRadioBox::SetLabel(int item , const wxString& label) +//------------------------------------------------------------------------------------- +// ¥ Command +//------------------------------------------------------------------------------------- +// Simulates the effect of the user issuing a command to the item + +void wxRadioBox::Command (wxCommandEvent & event) { - // TODO + SetSelection (event.GetInt()); + ProcessCommand (event); } +//------------------------------------------------------------------------------------- +// ¥ SetFocus +//------------------------------------------------------------------------------------- +// Sets the selected button to receive keyboard input + void wxRadioBox::SetFocus() { - // TODO + int i; + wxRadioButton *current; + + i=0; + current=m_radioButtonCycle; + while (!current->GetValue()) { + i++; + current=current->NextInCycle(); + } + current->SetFocus(); } -bool wxRadioBox::Show(bool show) -{ - return wxControl::Show( show ) ; -} -// Enable a specific button -void wxRadioBox::Enable(int item, bool enable) -{ -} +//------------------------------------------------------------------------------------- +// ¥ DoSetSize +//------------------------------------------------------------------------------------- +// Simulates the effect of the user issuing a command to the item -// Enable all controls -bool wxRadioBox::Enable(bool enable) +#define RADIO_SIZE 20 + +void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - return wxControl::Enable(enable); + 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)) + 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; + + 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; + } } -// Show a specific button -void wxRadioBox::Show(int item, bool show) +wxSize wxRadioBox::DoGetBestSize() const { - // TODO + 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 +//------------------------------------------------------------------------------------- +// return the number of buttons in the vertical direction -// For single selection items only -wxString wxRadioBox::GetStringSelection () const +int wxRadioBox::GetRowCount() const { - int sel = GetSelection (); - if (sel > -1) - return this->GetString (sel); + if ( m_windowStyle & wxRA_SPECIFY_ROWS ) + { + return m_majorDim; + } else - return wxString(""); + { + return (m_noItems + m_majorDim - 1)/m_majorDim; + } } -bool wxRadioBox::SetStringSelection (const wxString& s) +//------------------------------------------------------------------------------------- +// ¥ GetNumHor +//------------------------------------------------------------------------------------- +// return the number of buttons in the horizontal direction + +int wxRadioBox::GetColumnCount() const { - int sel = FindString (s); - if (sel > -1) + if ( m_windowStyle & wxRA_SPECIFY_ROWS ) { - SetSelection (sel); - return TRUE; + return (m_noItems + m_majorDim - 1)/m_majorDim; } else - return FALSE; + { + return m_majorDim; + } } -void wxRadioBox::Command (wxCommandEvent & event) -{ - SetSelection (event.m_commandInt); - ProcessCommand (event); -} + +