From 1395ff56f4a8dd0fa400abc0faecc281c304caf7 Mon Sep 17 00:00:00 2001 From: "Unknown (JL)" Date: Fri, 19 Nov 1999 00:11:42 +0000 Subject: [PATCH] with only a little modification could be generic git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4626 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/mac/radiobox.h | 122 ++++---- src/mac/carbon/radiobox.cpp | 540 ++++++++++++++++++++++++++++++------ src/mac/radiobox.cpp | 540 ++++++++++++++++++++++++++++++------ 3 files changed, 954 insertions(+), 248 deletions(-) diff --git a/include/wx/mac/radiobox.h b/include/wx/mac/radiobox.h index 9e2f3611ba..23536ff245 100644 --- a/include/wx/mac/radiobox.h +++ b/include/wx/mac/radiobox.h @@ -22,91 +22,69 @@ WXDLLEXPORT_DATA(extern const char*) wxRadioBoxNameStr; // List box item class WXDLLEXPORT wxBitmap ; + class WXDLLEXPORT wxRadioButton ; class WXDLLEXPORT wxRadioBox: public wxControl { - DECLARE_DYNAMIC_CLASS(wxRadioBox) - + DECLARE_DYNAMIC_CLASS(wxRadioBox) public: - wxRadioBox(); +// Constructors & destructor + wxRadioBox(); + inline wxRadioBox(wxWindow *parent, wxWindowID id, const wxString& title, + const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + int majorDim = 0, long style = wxRA_HORIZONTAL, + const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr) + { + Create(parent, id, title, pos, size, n, choices, majorDim, style, val, name); + } + ~wxRadioBox(); + bool Create(wxWindow *parent, wxWindowID id, const wxString& title, + const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + int majorDim = 0, long style = wxRA_HORIZONTAL, + const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr); - wxRadioBox(wxWindow *parent, wxWindowID id, const wxString& title, - const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - int n = 0, const wxString choices[] = NULL, - int majorDim = 0, long style = wxRA_HORIZONTAL, - const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr) - { - Create(parent, id, title, pos, size, n, choices, majorDim, style, val, name); - } +// Specific functions (in wxWindows2 reference) + void Enable(bool enable); + void Enable(int item, bool enable); + int FindString(const wxString& s) const; + wxString GetLabel() const; + wxString GetLabel(int item) const; + int GetSelection() const; + wxString GetString(int item) const; + virtual wxString GetStringSelection() const; + inline virtual int Number() const { return m_noItems; } ; + void SetLabel(const wxString& label) ; + void SetLabel(int item, const wxString& label) ; + void SetSelection(int item); + virtual bool SetStringSelection(const wxString& s); + bool Show(bool show); + void Show(int item, bool show) ; - ~wxRadioBox(); +// Other external functions + void Command(wxCommandEvent& event); + void SetFocus(); - bool Create(wxWindow *parent, wxWindowID id, const wxString& title, - const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - int n = 0, const wxString choices[] = NULL, - int majorDim = 0, long style = wxRA_HORIZONTAL, - const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr); - - int FindString(const wxString& s) const; - void SetSelection(int N); - int GetSelection() const; - wxString GetString(int N) const; - - void GetSize(int *x, int *y) const; - void GetPosition(int *x, int *y) const; - - void SetLabel(int item, const wxString& label); - void SetLabel(int item, wxBitmap *bitmap); - wxString GetLabel(int item) const; - bool Show(bool show); - void SetFocus(); - bool Enable(bool enable); - void Enable(int item, bool enable); - void Show(int item, bool show); - void SetLabelFont(const wxFont& WXUNUSED(font)) {}; - void SetButtonFont(const wxFont& font) { SetFont(font); } - - virtual wxString GetStringSelection() const; - virtual bool SetStringSelection(const wxString& s); - virtual int Number() const { return m_noItems; }; - void Command(wxCommandEvent& event); - - int GetNumberOfRowsOrCols() const { return m_noRowsOrCols; } - void SetNumberOfRowsOrCols(int n) { m_noRowsOrCols = n; } - - // implementation only from now on - // ------------------------------- - - wxRadioButton *GetRadioButtons() const { return m_radioButtons; } - void SendNotificationEvent(); - - // get the number of buttons per column/row - int GetNumVer() const; - int GetNumHor() const; - -#if WXWIN_COMPATIBILITY - wxRadioBox(wxWindow *parent, wxFunction func, const char *title, - int x = -1, int y = -1, int width = -1, int height = -1, - int n = 0, char **choices = NULL, - int majorDim = 0, long style = wxRA_HORIZONTAL, const char *name = wxRadioBoxNameStr); -#endif // WXWIN_COMPATIBILITY +// Other variable access functions + inline int GetNumberOfRowsOrCols() const { return m_noRowsOrCols; } + inline void SetNumberOfRowsOrCols(int n) { m_noRowsOrCols = n; } protected: - void SubclassRadioButton(WXHWND hWndBtn); + wxRadioButton *m_radioButtonCycle; + + int m_majorDim ; + int m_noItems; + int m_noRowsOrCols; - wxRadioButton * m_radioButtons; - int m_majorDim; - int * m_radioWidth; // for bitmaps - int * m_radioHeight; - - int m_noItems; - int m_noRowsOrCols; - int m_selectedButton; - - virtual void DoSetSize(int x, int y, +// Internal functions + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + int GetNumHor() const; + int GetNumVer() const; + }; #endif diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index b1f4dbf615..d00911c8fd 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -2,54 +2,89 @@ // Name: radiobox.cpp // Purpose: wxRadioBox // Author: AUTHOR -// Modified by: +// Modified by: JS Lair (99/11/15) first implementation // Created: ??/??/98 // RCS-ID: $Id$ // Copyright: (c) AUTHOR // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------- +// headers +//------------------------------------------------------------------------------------- + #ifdef __GNUG__ #pragma implementation "radiobox.h" #endif #include "wx/radiobox.h" +#include #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) #endif -// Radio box item +#pragma mark - +#pragma mark ### Constructors & destructor ### + +//------------------------------------------------------------------------------------- +// ¥ wxRadioBox() +//------------------------------------------------------------------------------------- +// Default constructor + 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, +//------------------------------------------------------------------------------------- +// ¥ 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; +} + +//------------------------------------------------------------------------------------- +// ¥ 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) { - m_selectedButton = -1; + int i; + m_noItems = n; - - SetName(name); - SetValidator(val); - - parent->AddChild(this); - - m_windowStyle = (long&)style; - - if (id == -1) - m_windowId = NewControlId(); - else - m_windowId = id; - m_noRowsOrCols = majorDim; + m_radioButtonCycle = NULL; if (majorDim==0) m_majorDim = n ; @@ -57,98 +92,161 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, m_majorDim = majorDim ; - // TODO create radiobox - return FALSE; + Rect bounds ; + Str255 title ; + + MacPreControlCreate( parent , id , label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ; + + m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, + kControlGroupBoxTextTitleProc , (long) this ) ; + + MacPostControlCreate() ; + + 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); + } + + SetSelection(0); + SetSize(pos.x,pos.y,size.x,size.y); + + return TRUE; } -wxRadioBox::~wxRadioBox() +#pragma mark - +#pragma mark ### Specific functions (reference v2) ### + +//------------------------------------------------------------------------------------- +// ¥ Enable(bool) +//------------------------------------------------------------------------------------- +// Enables or disables the entire radiobox + +void wxRadioBox::Enable(bool enable) { - // TODO + int i; + wxRadioButton *current; + + wxControl::Enable(enable); + + current=m_radioButtonCycle; + for (i=0;iEnable(enable); + current=current->NextInCycle(); + } } +//------------------------------------------------------------------------------------- +// ¥ Enable(int, bool) +//------------------------------------------------------------------------------------- +// Enables or disables an given button + +void wxRadioBox::Enable(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(); + } + return current->Enable(enable); +} + + +//------------------------------------------------------------------------------------- +// ¥ 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 { - // TODO + int i; + wxRadioButton *current; + + current=m_radioButtonCycle; + for (i = 0; i < m_noItems; i++) + { + if (s == current->GetLabel()) + return i; + current=current->NextInCycle(); + } return -1; } -void wxRadioBox::SetSelection(int n) -{ - if ((n < 0) || (n >= m_noItems)) - return; - // TODO +//------------------------------------------------------------------------------------- +// ¥ GetLabel() +//------------------------------------------------------------------------------------- +// Returns the radiobox label - m_selectedButton = n; +wxString wxRadioBox::GetLabel() const +{ + return wxControl::GetLabel(); } -// Get single selection, for single choice list items +//------------------------------------------------------------------------------------- +// ¥ GetLabel(int) +//------------------------------------------------------------------------------------- +// Returns the label for the given button + +wxString wxRadioBox::GetLabel(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(); + } + return current->GetLabel(); +} + +//------------------------------------------------------------------------------------- +// ¥ 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; } +//------------------------------------------------------------------------------------- +// ¥ GetString +//------------------------------------------------------------------------------------- // Find string for position -wxString wxRadioBox::GetString(int n) const + +wxString wxRadioBox::GetString(int item) const { - // TODO - return wxString(""); + + return GetLabel(item); } -void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) -{ - wxControl::DoSetSize( x , y , width , height , sizeFlags ) ; -} +//------------------------------------------------------------------------------------- +// ¥ GetStringSelection +//------------------------------------------------------------------------------------- +// Returns the selected string -void wxRadioBox::GetSize(int *width, int *height) const -{ - wxControl::GetSize( width , height ) ; -} - -void wxRadioBox::GetPosition(int *x, int *y) const -{ - wxControl::GetPosition( x , y ) ; -} - -wxString wxRadioBox::GetLabel( int item ) const -{ - // TODO - return wxString(""); -} - -void wxRadioBox::SetLabel(int item , const wxString& label) -{ - // TODO -} - -void wxRadioBox::SetFocus() -{ - // TODO -} - -bool wxRadioBox::Show(bool show) -{ - return wxControl::Show( show ) ; -} - -// Enable a specific button -void wxRadioBox::Enable(int item, bool enable) -{ -} - -// Enable all controls -bool wxRadioBox::Enable(bool enable) -{ - return wxControl::Enable(enable); -} - -// Show a specific button -void wxRadioBox::Show(int item, bool show) -{ - // TODO -} - -// For single selection items only wxString wxRadioBox::GetStringSelection () const { int sel = GetSelection (); @@ -158,6 +256,74 @@ wxString wxRadioBox::GetStringSelection () const return wxString(""); } +//------------------------------------------------------------------------------------- +// ¥ 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); +} + +//------------------------------------------------------------------------------------- +// ¥ SetLabel(int, const wxString&) +//------------------------------------------------------------------------------------- +// Sets the label of a given button + +void wxRadioBox::SetLabel(int item,const wxString& label) +{ + 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); +} + +//------------------------------------------------------------------------------------- +// ¥ 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) +{ + 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 + bool wxRadioBox::SetStringSelection (const wxString& s) { int sel = FindString (s); @@ -170,10 +336,208 @@ bool wxRadioBox::SetStringSelection (const wxString& s) return FALSE; } +//------------------------------------------------------------------------------------- +// ¥ Show(bool) +//------------------------------------------------------------------------------------- +// 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(); + } + return true; +} + +//------------------------------------------------------------------------------------- +// ¥ Show(int, bool) +//------------------------------------------------------------------------------------- +// Shows or hides the given button + +void wxRadioBox::Show(int item, bool show) +{ + 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); +} + +#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) { - SetSelection (event.m_commandInt); + 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(); +} + + +#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; + + 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; + } +} + +//------------------------------------------------------------------------------------- +// ¥ GetNumVer +//------------------------------------------------------------------------------------- +// return the number of buttons in the vertical direction + +int wxRadioBox::GetNumVer() 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::GetNumHor() const +{ + if ( m_windowStyle & wxRA_SPECIFY_ROWS ) + { + return (m_noItems + m_majorDim - 1)/m_majorDim; + } + else + { + return m_majorDim; + } +} + + + + diff --git a/src/mac/radiobox.cpp b/src/mac/radiobox.cpp index b1f4dbf615..d00911c8fd 100644 --- a/src/mac/radiobox.cpp +++ b/src/mac/radiobox.cpp @@ -2,54 +2,89 @@ // Name: radiobox.cpp // Purpose: wxRadioBox // Author: AUTHOR -// Modified by: +// Modified by: JS Lair (99/11/15) first implementation // Created: ??/??/98 // RCS-ID: $Id$ // Copyright: (c) AUTHOR // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------- +// headers +//------------------------------------------------------------------------------------- + #ifdef __GNUG__ #pragma implementation "radiobox.h" #endif #include "wx/radiobox.h" +#include #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) #endif -// Radio box item +#pragma mark - +#pragma mark ### Constructors & destructor ### + +//------------------------------------------------------------------------------------- +// ¥ wxRadioBox() +//------------------------------------------------------------------------------------- +// Default constructor + 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, +//------------------------------------------------------------------------------------- +// ¥ 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; +} + +//------------------------------------------------------------------------------------- +// ¥ 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) { - m_selectedButton = -1; + int i; + m_noItems = n; - - SetName(name); - SetValidator(val); - - parent->AddChild(this); - - m_windowStyle = (long&)style; - - if (id == -1) - m_windowId = NewControlId(); - else - m_windowId = id; - m_noRowsOrCols = majorDim; + m_radioButtonCycle = NULL; if (majorDim==0) m_majorDim = n ; @@ -57,98 +92,161 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, m_majorDim = majorDim ; - // TODO create radiobox - return FALSE; + Rect bounds ; + Str255 title ; + + MacPreControlCreate( parent , id , label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ; + + m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, + kControlGroupBoxTextTitleProc , (long) this ) ; + + MacPostControlCreate() ; + + 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); + } + + SetSelection(0); + SetSize(pos.x,pos.y,size.x,size.y); + + return TRUE; } -wxRadioBox::~wxRadioBox() +#pragma mark - +#pragma mark ### Specific functions (reference v2) ### + +//------------------------------------------------------------------------------------- +// ¥ Enable(bool) +//------------------------------------------------------------------------------------- +// Enables or disables the entire radiobox + +void wxRadioBox::Enable(bool enable) { - // TODO + int i; + wxRadioButton *current; + + wxControl::Enable(enable); + + current=m_radioButtonCycle; + for (i=0;iEnable(enable); + current=current->NextInCycle(); + } } +//------------------------------------------------------------------------------------- +// ¥ Enable(int, bool) +//------------------------------------------------------------------------------------- +// Enables or disables an given button + +void wxRadioBox::Enable(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(); + } + return current->Enable(enable); +} + + +//------------------------------------------------------------------------------------- +// ¥ 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 { - // TODO + int i; + wxRadioButton *current; + + current=m_radioButtonCycle; + for (i = 0; i < m_noItems; i++) + { + if (s == current->GetLabel()) + return i; + current=current->NextInCycle(); + } return -1; } -void wxRadioBox::SetSelection(int n) -{ - if ((n < 0) || (n >= m_noItems)) - return; - // TODO +//------------------------------------------------------------------------------------- +// ¥ GetLabel() +//------------------------------------------------------------------------------------- +// Returns the radiobox label - m_selectedButton = n; +wxString wxRadioBox::GetLabel() const +{ + return wxControl::GetLabel(); } -// Get single selection, for single choice list items +//------------------------------------------------------------------------------------- +// ¥ GetLabel(int) +//------------------------------------------------------------------------------------- +// Returns the label for the given button + +wxString wxRadioBox::GetLabel(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(); + } + return current->GetLabel(); +} + +//------------------------------------------------------------------------------------- +// ¥ 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; } +//------------------------------------------------------------------------------------- +// ¥ GetString +//------------------------------------------------------------------------------------- // Find string for position -wxString wxRadioBox::GetString(int n) const + +wxString wxRadioBox::GetString(int item) const { - // TODO - return wxString(""); + + return GetLabel(item); } -void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) -{ - wxControl::DoSetSize( x , y , width , height , sizeFlags ) ; -} +//------------------------------------------------------------------------------------- +// ¥ GetStringSelection +//------------------------------------------------------------------------------------- +// Returns the selected string -void wxRadioBox::GetSize(int *width, int *height) const -{ - wxControl::GetSize( width , height ) ; -} - -void wxRadioBox::GetPosition(int *x, int *y) const -{ - wxControl::GetPosition( x , y ) ; -} - -wxString wxRadioBox::GetLabel( int item ) const -{ - // TODO - return wxString(""); -} - -void wxRadioBox::SetLabel(int item , const wxString& label) -{ - // TODO -} - -void wxRadioBox::SetFocus() -{ - // TODO -} - -bool wxRadioBox::Show(bool show) -{ - return wxControl::Show( show ) ; -} - -// Enable a specific button -void wxRadioBox::Enable(int item, bool enable) -{ -} - -// Enable all controls -bool wxRadioBox::Enable(bool enable) -{ - return wxControl::Enable(enable); -} - -// Show a specific button -void wxRadioBox::Show(int item, bool show) -{ - // TODO -} - -// For single selection items only wxString wxRadioBox::GetStringSelection () const { int sel = GetSelection (); @@ -158,6 +256,74 @@ wxString wxRadioBox::GetStringSelection () const return wxString(""); } +//------------------------------------------------------------------------------------- +// ¥ 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); +} + +//------------------------------------------------------------------------------------- +// ¥ SetLabel(int, const wxString&) +//------------------------------------------------------------------------------------- +// Sets the label of a given button + +void wxRadioBox::SetLabel(int item,const wxString& label) +{ + 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); +} + +//------------------------------------------------------------------------------------- +// ¥ 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) +{ + 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 + bool wxRadioBox::SetStringSelection (const wxString& s) { int sel = FindString (s); @@ -170,10 +336,208 @@ bool wxRadioBox::SetStringSelection (const wxString& s) return FALSE; } +//------------------------------------------------------------------------------------- +// ¥ Show(bool) +//------------------------------------------------------------------------------------- +// 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(); + } + return true; +} + +//------------------------------------------------------------------------------------- +// ¥ Show(int, bool) +//------------------------------------------------------------------------------------- +// Shows or hides the given button + +void wxRadioBox::Show(int item, bool show) +{ + 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); +} + +#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) { - SetSelection (event.m_commandInt); + 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(); +} + + +#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; + + 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; + } +} + +//------------------------------------------------------------------------------------- +// ¥ GetNumVer +//------------------------------------------------------------------------------------- +// return the number of buttons in the vertical direction + +int wxRadioBox::GetNumVer() 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::GetNumHor() const +{ + if ( m_windowStyle & wxRA_SPECIFY_ROWS ) + { + return (m_noItems + m_majorDim - 1)/m_majorDim; + } + else + { + return m_majorDim; + } +} + + + +