wxRadioBox now generates the EVT_FOCUS_SET/KILL events (tests for this added

to the controls sample)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7196 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-04-17 16:11:16 +00:00
parent 23373d8e9b
commit 897e170014
5 changed files with 254 additions and 49 deletions

View File

@@ -43,21 +43,34 @@ extern const char *wxRadioBoxNameStr;
class wxRadioBox: public wxControl
{
public:
wxRadioBox();
inline wxRadioBox( wxWindow *parent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = (const wxString *) NULL,
int majorDim = 1, long style = wxRA_HORIZONTAL,
wxRadioBox() { Init(); }
wxRadioBox(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0,
const wxString choices[] = (const wxString *) NULL,
int majorDim = 1,
long style = wxRA_HORIZONTAL,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxRadioBoxNameStr)
{
Init();
Create( parent, id, title, pos, size, n, choices, majorDim, style, val, name );
}
~wxRadioBox(void);
bool Create( wxWindow *parent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = (const wxString *) NULL,
int majorDim = 0, long style = wxRA_HORIZONTAL,
~wxRadioBox();
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0,
const wxString choices[] = (const wxString *) NULL,
int majorDim = 0,
long style = wxRA_HORIZONTAL,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxRadioBoxNameStr);
@@ -100,12 +113,20 @@ public:
void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#endif // wxUSE_TOOLTIPS
wxSize LayoutItems();
void DoSetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO );
virtual void DoSetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO );
virtual void OnInternalIdle();
bool m_alreadySent;
bool m_hasFocus,
m_lostFocus;
int m_majorDim;
wxList m_boxes;
protected:
// common part of all ctors
void Init();
private:
DECLARE_DYNAMIC_CLASS(wxRadioBox)
};

View File

@@ -43,21 +43,34 @@ extern const char *wxRadioBoxNameStr;
class wxRadioBox: public wxControl
{
public:
wxRadioBox();
inline wxRadioBox( wxWindow *parent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = (const wxString *) NULL,
int majorDim = 1, long style = wxRA_HORIZONTAL,
wxRadioBox() { Init(); }
wxRadioBox(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0,
const wxString choices[] = (const wxString *) NULL,
int majorDim = 1,
long style = wxRA_HORIZONTAL,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxRadioBoxNameStr)
{
Init();
Create( parent, id, title, pos, size, n, choices, majorDim, style, val, name );
}
~wxRadioBox(void);
bool Create( wxWindow *parent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = (const wxString *) NULL,
int majorDim = 0, long style = wxRA_HORIZONTAL,
~wxRadioBox();
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0,
const wxString choices[] = (const wxString *) NULL,
int majorDim = 0,
long style = wxRA_HORIZONTAL,
const wxValidator& val = wxDefaultValidator,
const wxString& name = wxRadioBoxNameStr);
@@ -100,12 +113,20 @@ public:
void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#endif // wxUSE_TOOLTIPS
wxSize LayoutItems();
void DoSetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO );
virtual void DoSetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO );
virtual void OnInternalIdle();
bool m_alreadySent;
bool m_hasFocus,
m_lostFocus;
int m_majorDim;
wxList m_boxes;
protected:
// common part of all ctors
void Init();
private:
DECLARE_DYNAMIC_CLASS(wxRadioBox)
};

View File

@@ -209,6 +209,42 @@ private:
DECLARE_EVENT_TABLE()
};
// a radiobox which handles focus set/kill (for testing)
class MyRadioBox : public wxRadioBox
{
public:
MyRadioBox(wxWindow *parent,
wxWindowID id,
const wxString& title = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = NULL,
int majorDim = 1,
long style = wxRA_HORIZONTAL,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxComboBoxNameStr)
: wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
style, validator, name) { }
protected:
void OnFocusGot(wxFocusEvent& event)
{
wxLogMessage(_T("MyRadioBox::OnFocusGot"));
event.Skip();
}
void OnFocusLost(wxFocusEvent& event)
{
wxLogMessage(_T("MyRadioBox::OnFocusLost"));
event.Skip();
}
private:
DECLARE_EVENT_TABLE()
};
//----------------------------------------------------------------------
// other
//----------------------------------------------------------------------
@@ -421,6 +457,11 @@ BEGIN_EVENT_TABLE(MyComboBox, wxComboBox)
EVT_KEY_UP(MyComboBox::OnKeyUp)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
END_EVENT_TABLE()
// ============================================================================
// implementation
// ============================================================================
@@ -593,7 +634,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
};
panel = new wxPanel(m_notebook);
(void)new wxRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
(void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
#if wxUSE_TOOLTIPS

View File

@@ -114,14 +114,58 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_
return TRUE;
}
static gint gtk_radiobutton_focus_in( GtkWidget *widget,
GdkEvent *WXUNUSED(event),
wxRadioBox *win )
{
if ( win->m_lostFocus )
{
// no, we didn't really lose it
win->m_lostFocus = FALSE;
}
else if ( !win->m_hasFocus )
{
win->m_hasFocus = TRUE;
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
event.SetEventObject( win );
// never stop the signal emission, it seems to break the kbd handling
// inside the radiobox
(void)win->GetEventHandler()->ProcessEvent( event );
}
return FALSE;
}
static gint gtk_radiobutton_focus_out( GtkWidget *widget,
GdkEvent *WXUNUSED(event),
wxRadioBox *win )
{
wxASSERT_MSG( win->m_hasFocus, _T("got focus out without any focus in?") );
// we might have lost the focus, but may be not - it may have just gone to
// another button in the same radiobox, so we'll check for it in the next
// idle iteration (leave m_hasFocus == TRUE for now)
win->m_lostFocus = TRUE;
return FALSE;
}
//-----------------------------------------------------------------------------
// wxRadioBox
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl)
wxRadioBox::wxRadioBox()
void wxRadioBox::Init()
{
m_alreadySent = FALSE;
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_hasFocus =
m_lostFocus = FALSE;
}
bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
@@ -130,10 +174,6 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
long style, const wxValidator& validator,
const wxString &name )
{
m_alreadySent = FALSE;
m_needParent = TRUE;
m_acceptsFocus = TRUE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
{
@@ -175,6 +215,12 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
gtk_signal_connect( GTK_OBJECT(m_radio), "clicked",
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
gtk_signal_connect( GTK_OBJECT(m_radio), "focus_in_event",
GTK_SIGNAL_FUNC(gtk_radiobutton_focus_in), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_radio), "focus_out_event",
GTK_SIGNAL_FUNC(gtk_radiobutton_focus_out), (gpointer)this );
gtk_pizza_put( GTK_PIZZA(m_parent->m_wxwindow),
GTK_WIDGET(m_radio),
m_x+10, m_y+10+(i*24), 10, 10 );
@@ -665,4 +711,19 @@ bool wxRadioBox::IsOwnGtkWindow( GdkWindow *window )
return FALSE;
}
#endif
void wxRadioBox::OnInternalIdle()
{
if ( m_lostFocus )
{
m_hasFocus = FALSE;
m_lostFocus = FALSE;
wxFocusEvent event( wxEVT_KILL_FOCUS, GetId() );
event.SetEventObject( this );
(void)GetEventHandler()->ProcessEvent( event );
}
}
#endif // wxUSE_RADIOBOX

View File

@@ -114,14 +114,58 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_
return TRUE;
}
static gint gtk_radiobutton_focus_in( GtkWidget *widget,
GdkEvent *WXUNUSED(event),
wxRadioBox *win )
{
if ( win->m_lostFocus )
{
// no, we didn't really lose it
win->m_lostFocus = FALSE;
}
else if ( !win->m_hasFocus )
{
win->m_hasFocus = TRUE;
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
event.SetEventObject( win );
// never stop the signal emission, it seems to break the kbd handling
// inside the radiobox
(void)win->GetEventHandler()->ProcessEvent( event );
}
return FALSE;
}
static gint gtk_radiobutton_focus_out( GtkWidget *widget,
GdkEvent *WXUNUSED(event),
wxRadioBox *win )
{
wxASSERT_MSG( win->m_hasFocus, _T("got focus out without any focus in?") );
// we might have lost the focus, but may be not - it may have just gone to
// another button in the same radiobox, so we'll check for it in the next
// idle iteration (leave m_hasFocus == TRUE for now)
win->m_lostFocus = TRUE;
return FALSE;
}
//-----------------------------------------------------------------------------
// wxRadioBox
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl)
wxRadioBox::wxRadioBox()
void wxRadioBox::Init()
{
m_alreadySent = FALSE;
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_hasFocus =
m_lostFocus = FALSE;
}
bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
@@ -130,10 +174,6 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
long style, const wxValidator& validator,
const wxString &name )
{
m_alreadySent = FALSE;
m_needParent = TRUE;
m_acceptsFocus = TRUE;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
{
@@ -175,6 +215,12 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
gtk_signal_connect( GTK_OBJECT(m_radio), "clicked",
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
gtk_signal_connect( GTK_OBJECT(m_radio), "focus_in_event",
GTK_SIGNAL_FUNC(gtk_radiobutton_focus_in), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(m_radio), "focus_out_event",
GTK_SIGNAL_FUNC(gtk_radiobutton_focus_out), (gpointer)this );
gtk_pizza_put( GTK_PIZZA(m_parent->m_wxwindow),
GTK_WIDGET(m_radio),
m_x+10, m_y+10+(i*24), 10, 10 );
@@ -665,4 +711,19 @@ bool wxRadioBox::IsOwnGtkWindow( GdkWindow *window )
return FALSE;
}
#endif
void wxRadioBox::OnInternalIdle()
{
if ( m_lostFocus )
{
m_hasFocus = FALSE;
m_lostFocus = FALSE;
wxFocusEvent event( wxEVT_KILL_FOCUS, GetId() );
event.SetEventObject( this );
(void)GetEventHandler()->ProcessEvent( event );
}
}
#endif // wxUSE_RADIOBOX