Files
wxWidgets/src/gtk/radiobut.cpp
Robert Roebling e2762ff06a wxListBox mouse events now report coords relative
to the whole list box.
  wxRadioButton doesn't emit any event when unpressed.
  Similar correction to wxRadioBox and wxToggleButton.
  Upported change to wxMenuEvent so that the id is
     set in the constructor. Otherwise the EVT_MENU
     macro is pretty useless. Already in 2.2.8.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12358 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2001-11-08 23:24:16 +00:00

230 lines
6.3 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: radiobut.cpp
// Purpose:
// Author: Robert Roebling
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "radiobut.h"
#endif
#include "wx/defs.h"
#if wxUSE_RADIOBOX
#include "wx/radiobut.h"
#include <gdk/gdk.h>
#include <gtk/gtk.h>
//-----------------------------------------------------------------------------
// idle system
//-----------------------------------------------------------------------------
extern void wxapp_install_idle_handler();
extern bool g_isIdle;
//-----------------------------------------------------------------------------
// data
//-----------------------------------------------------------------------------
extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor;
//-----------------------------------------------------------------------------
// "clicked"
//-----------------------------------------------------------------------------
static
void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *rb )
{
if (g_isIdle) wxapp_install_idle_handler();
if (!rb->m_hasVMT) return;
if (g_blockEventsOnDrag) return;
if (!button->active) return;
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
event.SetInt( rb->GetValue() );
event.SetEventObject( rb );
rb->GetEventHandler()->ProcessEvent( event );
}
//-----------------------------------------------------------------------------
// wxRadioButton
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxRadioButton,wxControl)
bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& label,
const wxPoint& pos, const wxSize& size, long style,
const wxValidator& validator, const wxString& name )
{
m_acceptsFocus = TRUE;
m_needParent = TRUE;
m_isRadioButton = TRUE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
{
wxFAIL_MSG( wxT("wxRadioButton creation failed") );
return FALSE;
}
if (HasFlag(wxRB_GROUP))
{
/* start a new group */
m_radioButtonGroup = (GSList*) NULL;
}
else
{
/* search backward for last group start */
wxRadioButton *chief = (wxRadioButton*) NULL;
wxWindowList::Node *node = parent->GetChildren().GetLast();
while (node)
{
wxWindow *child = node->GetData();
if (child->m_isRadioButton)
{
chief = (wxRadioButton*) child;
if (child->HasFlag(wxRB_GROUP)) break;
}
node = node->GetPrevious();
}
if (chief)
{
/* we are part of the group started by chief */
m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
}
else
{
/* start a new group */
m_radioButtonGroup = (GSList*) NULL;
}
}
m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() );
SetLabel(label);
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
m_parent->DoAddChild( this );
PostCreation();
SetFont( parent->GetFont() );
wxSize size_best( DoGetBestSize() );
wxSize new_size( size );
if (new_size.x == -1)
new_size.x = size_best.x;
if (new_size.y == -1)
new_size.y = size_best.y;
if ((new_size.x != size.x) || (new_size.y != size.y))
SetSize( new_size.x, new_size.y );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
Show( TRUE );
return TRUE;
}
void wxRadioButton::SetLabel( const wxString& label )
{
wxCHECK_RET( m_widget != NULL, wxT("invalid radiobutton") );
wxControl::SetLabel( label );
GtkButton *bin = GTK_BUTTON( m_widget );
GtkLabel *g_label = GTK_LABEL( bin->child );
gtk_label_set( g_label, GetLabel().mbc_str() );
}
void wxRadioButton::SetValue( bool val )
{
wxCHECK_RET( m_widget != NULL, wxT("invalid radiobutton") );
if (val == GetValue())
return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget),
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
if (val)
{
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget), TRUE );
}
else
{
// should give an assert
// RL - No it shouldn't. A wxGenericValidator might try to set it
// as FALSE. Failing silently is probably TRTTD here.
}
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
}
bool wxRadioButton::GetValue() const
{
wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid radiobutton") );
return GTK_TOGGLE_BUTTON(m_widget)->active;
}
bool wxRadioButton::Enable( bool enable )
{
if ( !wxControl::Enable( enable ) )
return FALSE;
gtk_widget_set_sensitive( GTK_BUTTON(m_widget)->child, enable );
return TRUE;
}
void wxRadioButton::ApplyWidgetStyle()
{
SetWidgetStyle();
gtk_widget_set_style( m_widget, m_widgetStyle );
gtk_widget_set_style( GTK_BUTTON(m_widget)->child, m_widgetStyle );
}
bool wxRadioButton::IsOwnGtkWindow( GdkWindow *window )
{
return (window == GTK_TOGGLE_BUTTON(m_widget)->event_window);
}
void wxRadioButton::OnInternalIdle()
{
wxCursor cursor = m_cursor;
if (g_globalCursor.Ok()) cursor = g_globalCursor;
if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
{
/* I now set the cursor the anew in every OnInternalIdle call
as setting the cursor in a parent window also effects the
windows above so that checking for the current cursor is
not possible. */
gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
}
UpdateWindowUI();
}
wxSize wxRadioButton::DoGetBestSize() const
{
return wxControl::DoGetBestSize();
}
#endif