More changes to various controls for more reliably

preventing them from emitting event when their
     state was changed programatically.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12467 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2001-11-17 23:50:58 +00:00
parent bc87fd68e3
commit 9864c56ded
16 changed files with 74 additions and 72 deletions

View File

@ -54,6 +54,8 @@ public:
GtkWidget *m_widgetCheckbox;
GtkWidget *m_widgetLabel;
bool m_blockEvent;
protected:
virtual wxSize DoGetBestSize() const;

View File

@ -50,6 +50,8 @@ public:
bool IsOwnGtkWindow( GdkWindow *window );
void OnInternalIdle();
bool m_blockEvent;
protected:
virtual wxSize DoGetBestSize() const;

View File

@ -62,7 +62,7 @@ public:
GdkColor *m_fg;
GdkColor *m_bg;
bool m_blockNextEvent;
bool m_blockEvent;
void OnInternalIdle();

View File

@ -63,12 +63,10 @@ public:
void SetLabel(const wxString& label);
bool Enable(bool enable = TRUE);
protected:
// Callback function given to gtk
static void gtk_togglebutton_clicked_callback(GtkWidget *widget,
wxToggleButton *win);
// implementation
bool m_blockEvent;
// wx stuff
void ApplyWidgetStyle();
bool IsOwnGtkWindow(GdkWindow *window);

View File

@ -54,6 +54,8 @@ public:
GtkWidget *m_widgetCheckbox;
GtkWidget *m_widgetLabel;
bool m_blockEvent;
protected:
virtual wxSize DoGetBestSize() const;

View File

@ -50,6 +50,8 @@ public:
bool IsOwnGtkWindow( GdkWindow *window );
void OnInternalIdle();
bool m_blockEvent;
protected:
virtual wxSize DoGetBestSize() const;

View File

@ -62,7 +62,7 @@ public:
GdkColor *m_fg;
GdkColor *m_bg;
bool m_blockNextEvent;
bool m_blockEvent;
void OnInternalIdle();

View File

@ -63,12 +63,10 @@ public:
void SetLabel(const wxString& label);
bool Enable(bool enable = TRUE);
protected:
// Callback function given to gtk
static void gtk_togglebutton_clicked_callback(GtkWidget *widget,
wxToggleButton *win);
// implementation
bool m_blockEvent;
// wx stuff
void ApplyWidgetStyle();
bool IsOwnGtkWindow(GdkWindow *window);

View File

@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
if (!cb->m_hasVMT) return;
if (g_blockEventsOnDrag) return;
if (cb->m_blockEvent) return;
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
event.SetInt( cb->GetValue() );
@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent,
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state )
if (state == GetValue())
return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox),
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
m_blockEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
"clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
m_blockEvent = FALSE;
}
bool wxCheckBox::GetValue() const

View File

@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r
if (g_blockEventsOnDrag) return;
if (!button->active) return;
if (rb->m_blockEvent) return;
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
event.SetInt( rb->GetValue() );
@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
m_acceptsFocus = TRUE;
m_needParent = TRUE;
m_isRadioButton = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
{
wxFAIL_MSG( wxT("wxRadioButton creation failed") );
return FALSE;
return FALSE;
}
if (HasFlag(wxRB_GROUP))
{
/* start a new group */
// start a new group
m_radioButtonGroup = (GSList*) NULL;
}
else
{
/* search backward for last group start */
// search backward for last group start
wxRadioButton *chief = (wxRadioButton*) NULL;
wxWindowList::Node *node = parent->GetChildren().GetLast();
while (node)
@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
}
if (chief)
{
/* we are part of the group started by 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 */
// start a new group
m_radioButtonGroup = (GSList*) NULL;
}
}
@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val )
if (val == GetValue())
return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget),
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
m_blockEvent = TRUE;
if (val)
{
@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val )
// 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 );
m_blockEvent = FALSE;
}
bool wxRadioButton::GetValue() const

View File

@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
wxapp_install_idle_handler();
wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
if ( tbar->m_blockNextEvent )
{
tbar->m_blockNextEvent = FALSE;
return;
}
if (tbar->m_blockEvent) return;
if (g_blockEventsOnDrag) return;
if (!tool->IsEnabled()) return;
@ -196,7 +193,7 @@ void wxToolBar::Init()
m_fg =
m_bg = (GdkColor *)NULL;
m_toolbar = (GtkToolbar *)NULL;
m_blockNextEvent = FALSE;
m_blockEvent = FALSE;
}
wxToolBar::~wxToolBar()
@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
}
m_blockNextEvent = TRUE; // we cannot use gtk_signal_disconnect here
m_blockEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
m_blockEvent = FALSE;
}
}

View File

@ -24,13 +24,15 @@ extern wxCursor g_globalCursor;
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
// Callback function given to gtk.
void wxToggleButton::gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{
if (g_isIdle)
wxapp_install_idle_handler();
if (!cb->m_hasVMT || g_blockEventsOnDrag)
return;
if (cb->m_blockEvent) return;
// Generate a wx event.
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId());
@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation(parent, pos, size) ||
!CreateBase(parent, id, pos, size, style, validator, name )) {
@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state)
if (state == GetValue())
return;
gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget),
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
m_blockEvent = TRUE;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
m_blockEvent = FALSE;
}
// bool GetValue() const

View File

@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
if (!cb->m_hasVMT) return;
if (g_blockEventsOnDrag) return;
if (cb->m_blockEvent) return;
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
event.SetInt( cb->GetValue() );
@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent,
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state )
if (state == GetValue())
return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox),
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
m_blockEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
"clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
m_blockEvent = FALSE;
}
bool wxCheckBox::GetValue() const

View File

@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r
if (g_blockEventsOnDrag) return;
if (!button->active) return;
if (rb->m_blockEvent) return;
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
event.SetInt( rb->GetValue() );
@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
m_acceptsFocus = TRUE;
m_needParent = TRUE;
m_isRadioButton = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
{
wxFAIL_MSG( wxT("wxRadioButton creation failed") );
return FALSE;
return FALSE;
}
if (HasFlag(wxRB_GROUP))
{
/* start a new group */
// start a new group
m_radioButtonGroup = (GSList*) NULL;
}
else
{
/* search backward for last group start */
// search backward for last group start
wxRadioButton *chief = (wxRadioButton*) NULL;
wxWindowList::Node *node = parent->GetChildren().GetLast();
while (node)
@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
}
if (chief)
{
/* we are part of the group started by 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 */
// start a new group
m_radioButtonGroup = (GSList*) NULL;
}
}
@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val )
if (val == GetValue())
return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget),
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
m_blockEvent = TRUE;
if (val)
{
@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val )
// 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 );
m_blockEvent = FALSE;
}
bool wxRadioButton::GetValue() const

View File

@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
wxapp_install_idle_handler();
wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
if ( tbar->m_blockNextEvent )
{
tbar->m_blockNextEvent = FALSE;
return;
}
if (tbar->m_blockEvent) return;
if (g_blockEventsOnDrag) return;
if (!tool->IsEnabled()) return;
@ -196,7 +193,7 @@ void wxToolBar::Init()
m_fg =
m_bg = (GdkColor *)NULL;
m_toolbar = (GtkToolbar *)NULL;
m_blockNextEvent = FALSE;
m_blockEvent = FALSE;
}
wxToolBar::~wxToolBar()
@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
}
m_blockNextEvent = TRUE; // we cannot use gtk_signal_disconnect here
m_blockEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
m_blockEvent = FALSE;
}
}

View File

@ -24,13 +24,15 @@ extern wxCursor g_globalCursor;
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
// Callback function given to gtk.
void wxToggleButton::gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{
if (g_isIdle)
wxapp_install_idle_handler();
if (!cb->m_hasVMT || g_blockEventsOnDrag)
return;
if (cb->m_blockEvent) return;
// Generate a wx event.
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId());
@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation(parent, pos, size) ||
!CreateBase(parent, id, pos, size, style, validator, name )) {
@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state)
if (state == GetValue())
return;
gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget),
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
m_blockEvent = TRUE;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
m_blockEvent = FALSE;
}
// bool GetValue() const