// Name: radiobut.cpp
// Purpose: wxRadioButton
// Author: AUTHOR
-// Modified by: JS Lair (99/11/15) adding the cyclic groupe notion for radiobox
+// Modified by: JS Lair (99/11/15) adding the cyclic group notion for radiobox
// Created: ??/??/98
// RCS-ID: $Id$
// Copyright: (c) AUTHOR
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "radiobut.h"
-#endif
+#include "wx/wxprec.h"
-#include "wx/radiobut.h"
+#if wxUSE_RADIOBTN
+#include "wx/radiobut.h"
+#include "wx/mac/uma.h"
IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl)
-BEGIN_EVENT_TABLE(wxRadioButton, wxControl)
- EVT_IDLE( wxRadioButton::OnIdle )
-END_EVENT_TABLE()
-
-#include <wx/mac/uma.h>
-bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
- const wxString& label,
- const wxPoint& pos,
- const wxSize& size, long style,
- const wxValidator& validator,
- const wxString& name)
+bool wxRadioButton::Create( wxWindow *parent,
+ wxWindowID id,
+ const wxString& label,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name )
{
- Rect bounds ;
- Str255 title ;
-
- m_cycle=NULL;
-
- MacPreControlCreate( parent , id , label , pos , size ,style, validator , name , &bounds , title ) ;
-
- m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1,
- kControlRadioButtonProc , (long) this ) ;
-
- MacPostControlCreate() ;
-
- return TRUE;
-}
+ m_macIsUserPane = false;
-void wxRadioButton::OnIdle( wxIdleEvent &event )
-{
- if (!m_cycle && HasFlag(wxRB_GROUP))
+ if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) )
+ return false;
+
+ m_label = label;
+
+ Rect bounds = wxMacGetBoundsForControl( this, pos, size );
+
+ m_peer = new wxMacControl( this );
+ OSStatus err = CreateRadioButtonControl(
+ MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, CFSTR(""),
+ 0, false /* no autotoggle */, m_peer->GetControlRefAddr() );
+ verify_noerr( err );
+
+ MacPostControlCreate( pos, size );
+
+ m_cycle = this;
+
+ if (HasFlag( wxRB_GROUP ))
+ {
+ AddInCycle( NULL );
+ }
+ else
{
- // we are a stand-alone radiobutton and have
- // the group flag indicating we have to collect
- // the other radiobuttons belonging to this one
-
- bool reached_this = FALSE;
- wxRadioButton *m_radioButtonCycle = NULL;
- m_radioButtonCycle = AddInCycle( m_radioButtonCycle );
-
- wxWindow *parent = GetParent();
- wxNode *node = parent->GetChildren().First();
+ // search backward for last group start
+ wxRadioButton *chief = NULL;
+ wxWindowList::compatibility_iterator node = parent->GetChildren().GetLast();
while (node)
{
- wxWindow *child = (wxWindow*) node->Data();
-
- node = node->Next();
-
- // start searching behind current radiobutton
- if (!reached_this)
+ wxWindow *child = node->GetData();
+ if (child->IsKindOf( CLASSINFO( wxRadioButton ) ))
{
- reached_this = (this == child);
- continue;
+ chief = (wxRadioButton*)child;
+ if (child->HasFlag( wxRB_GROUP ))
+ break;
}
-
- if (child->IsKindOf( CLASSINFO ( wxRadioButton ) ))
- {
- wxRadioButton *rb = (wxRadioButton*) child;
-
- // already reached next group
- if (rb->HasFlag(wxRB_GROUP)) break;
-
- // part of a radiobox
- if (rb->NextInCycle()) break;
-
- m_radioButtonCycle = rb->AddInCycle( m_radioButtonCycle );
- }
+
+ node = node->GetPrevious();
}
-
+
+ AddInCycle( chief );
}
-
- event.Skip( TRUE );
+
+ return true;
+}
+
+wxRadioButton::~wxRadioButton()
+{
+ RemoveFromCycle();
}
void wxRadioButton::SetValue(bool val)
{
- int i;
- wxRadioButton *cycle;
-
- ::SetControlValue( m_macControl , val ) ;
-
- if (val)
- {
- cycle=this->NextInCycle();
- if (cycle!=NULL) {
- while (cycle!=this) {
- cycle->SetValue(false);
- cycle=cycle->NextInCycle();
- }
- }
- }
+ wxRadioButton *cycle;
+ if (m_peer->GetValue() == val)
+ return;
+
+ m_peer->SetValue( val );
+ if (val)
+ {
+ cycle = this->NextInCycle();
+ if (cycle != NULL)
+ {
+ while (cycle != this)
+ {
+ cycle->SetValue( false );
+ cycle = cycle->NextInCycle();
+ }
+ }
+ }
}
bool wxRadioButton::GetValue() const
{
- return ::GetControlValue( m_macControl ) ;
+ return m_peer->GetValue();
}
-void wxRadioButton::Command (wxCommandEvent & event)
+void wxRadioButton::Command(wxCommandEvent& event)
{
- SetValue ( (event.GetInt() != 0) );
- ProcessCommand (event);
+ SetValue( (event.GetInt() != 0) );
+ ProcessCommand( event );
}
-void wxRadioButton::MacHandleControlClick( ControlHandle control , SInt16 controlpart )
+wxInt32 wxRadioButton::MacControlHit( WXEVENTHANDLERREF WXUNUSED(handler), WXEVENTREF WXUNUSED(event) )
{
- SetValue(true) ;
- wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId );
- event.SetEventObject(this);
- ProcessCommand(event);
+ // if already set -> no action
+ if (GetValue())
+ return noErr;
+
+ wxRadioButton *cycle;
+ cycle = this->NextInCycle();
+ if (cycle != NULL)
+ {
+ while (cycle != this)
+ {
+ if (cycle->GetValue())
+ cycle->SetValue( false );
+
+ cycle = cycle->NextInCycle();
+ }
+ }
+
+ SetValue( true );
+
+ wxCommandEvent event2( wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId );
+ event2.SetEventObject( this );
+ event2.SetInt( true );
+ ProcessCommand( event2 );
+
+ return noErr;
}
wxRadioButton *wxRadioButton::AddInCycle(wxRadioButton *cycle)
{
- wxRadioButton *next,*current;
-
- if (cycle==NULL) {
- m_cycle=this;
- return(this);
- }
- else {
- current=cycle;
- while ((next=current->m_cycle)!=cycle) current=current->m_cycle;
- m_cycle=cycle;
- current->m_cycle=this;
- return(cycle);
- }
-}
+ wxRadioButton *next, *current;
+
+ if (cycle == NULL)
+ {
+ m_cycle = this;
+ }
+ else
+ {
+ current = cycle;
+ while ((next = current->m_cycle) != cycle)
+ current = current->m_cycle;
+
+ m_cycle = cycle;
+ current->m_cycle = this;
+ }
+
+ return m_cycle;
+}
+
+void wxRadioButton::RemoveFromCycle()
+{
+ if ((m_cycle == NULL) || (m_cycle == this))
+ return;
+
+ // Find the previous one and make it point to the next one
+ wxRadioButton* prev = this;
+ while (prev->m_cycle != this)
+ prev = prev->m_cycle;
+
+ prev->m_cycle = m_cycle;
+}
+
+#endif