git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4273
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// set the focus to the first child if we get it
void OnFocus(wxFocusEvent& event);
// set the focus to the first child if we get it
void OnFocus(wxFocusEvent& event);
+ // calls layout for layout constraints and sizers
void OnSize(wxSizeEvent& event);
void OnSize(wxSizeEvent& event);
+ // overridden to tab move focus into first focusable child
+ virtual void SetFocus();
+
// called by wxWindow whenever it gets focus
void SetLastFocus(wxWindow *win) { m_winLastFocused = win; }
wxWindow *GetLastFocus() const { return m_winLastFocused; }
// called by wxWindow whenever it gets focus
void SetLastFocus(wxWindow *win) { m_winLastFocused = win; }
wxWindow *GetLastFocus() const { return m_winLastFocused; }
(void) new wxListBox( this, -1, wxPoint(260,280), wxSize(120,120), 5, choices, wxLB_ALWAYS_SB );
(void) new wxListBox( this, -1, wxPoint(260,280), wxSize(120,120), 5, choices, wxLB_ALWAYS_SB );
- wxWindow *test = new wxWindow( this, -1, wxPoint(10, 530), wxSize(130,120), wxSIMPLE_BORDER | wxTAB_TRAVERSAL );
+ wxPanel *test = new wxPanel( this, -1, wxPoint(10, 530), wxSize(130,120), wxSIMPLE_BORDER | wxTAB_TRAVERSAL );
test->SetBackgroundColour( "WHEAT" );
wxButton *test2 = new wxButton( test, -1, "Hallo", wxPoint(10,10) );
test->SetBackgroundColour( "WHEAT" );
wxButton *test2 = new wxButton( test, -1, "Hallo", wxPoint(10,10) );
- test = new wxWindow( this, -1, wxPoint(160, 530), wxSize(130,120), wxSUNKEN_BORDER | wxTAB_TRAVERSAL );
+ test = new wxPanel( this, -1, wxPoint(160, 530), wxSize(130,120), wxSUNKEN_BORDER | wxTAB_TRAVERSAL );
test->SetBackgroundColour( "WHEAT" );
test->SetCursor( wxCursor( wxCURSOR_NO_ENTRY ) );
test2 = new wxButton( test, -1, "Hallo", wxPoint(10,10) );
test2->SetCursor( wxCursor( wxCURSOR_PENCIL ) );
test->SetBackgroundColour( "WHEAT" );
test->SetCursor( wxCursor( wxCURSOR_NO_ENTRY ) );
test2 = new wxButton( test, -1, "Hallo", wxPoint(10,10) );
test2->SetCursor( wxCursor( wxCURSOR_PENCIL ) );
- test = new wxWindow( this, -1, wxPoint(310, 530), wxSize(130,120), wxRAISED_BORDER | wxTAB_TRAVERSAL );
+ test = new wxPanel( this, -1, wxPoint(310, 530), wxSize(130,120), wxRAISED_BORDER | wxTAB_TRAVERSAL );
test->SetBackgroundColour( "WHEAT" );
test->SetCursor( wxCursor( wxCURSOR_PENCIL ) );
test2 = new wxButton( test, -1, "Hallo", wxPoint(10,10) );
test->SetBackgroundColour( "WHEAT" );
test->SetCursor( wxCursor( wxCURSOR_PENCIL ) );
test2 = new wxButton( test, -1, "Hallo", wxPoint(10,10) );
- wxWindow *winFocus = event.GetCurrentFocus();
+ // Did the event emitter tell us where the last focus was?
+ // wxGTK does this in wxWindow, but wxMSW does not. It is
+ // also done in wxPanel if the event is propagated up.
+ wxWindow *winFocus = event.GetCurrentFocus();
+
+ // Do we know where the focus was ourselves, then?
+ if (!winFocus)
+ winFocus = m_winLastFocused;
+
if (!winFocus)
winFocus = wxWindow::FindFocus();
if (!winFocus)
winFocus = wxWindow::FindFocus();
while ( node != start_node )
{
while ( node != start_node )
{
+ // Have we come to the last or first item on the panel?
- // check if our (may be grand) parent is another panel: if this is
+ // Check if our (may be grand) parent is another panel: if this is
// the case, they will know what to do with this navigation key and
// so give them the chance to process it instead of looping inside
// this panel (normally, the focus will go to the next/previous
// the case, they will know what to do with this navigation key and
// so give them the chance to process it instead of looping inside
// this panel (normally, the focus will go to the next/previous
- // item after this panel in the parent panel)
- wxWindow *focussed_child_of_p = this;
- for ( wxWindow *p = GetParent(); p; p = p->GetParent() )
+ // item after this panel in the parent panel).
+ wxWindow *focussed_child_of_parent = this;
+ for ( wxWindow *parent = GetParent(); parent; parent = parent->GetParent() )
{
// we don't want to tab into a different dialog or frame
{
// we don't want to tab into a different dialog or frame
- if ( focussed_child_of_p->IsTopLevel() )
+ if ( focussed_child_of_parent->IsTopLevel() )
-
- if ( wxDynamicCast(p, wxPanel) )
+
+ // is the parent a panel?
+ wxPanel *panel = wxDynamicCast(parent, wxPanel);
+ if (panel)
- event.SetCurrentFocus( focussed_child_of_p );
- if (p->GetEventHandler()->ProcessEvent( event ))
+ event.SetCurrentFocus( focussed_child_of_parent );
+ if (parent->GetEventHandler()->ProcessEvent( event ))
- focussed_child_of_p = p;
+
+ focussed_child_of_parent = parent;
}
// no, we are not inside another panel so process this ourself
}
// no, we are not inside another panel so process this ourself
if ( child->AcceptsFocus() )
{
if ( child->AcceptsFocus() )
{
+ m_winLastFocused = child; // should be redundant, but it is not
child->SetFocus();
return;
}
child->SetFocus();
return;
}
+void wxPanel::SetFocus()
+{
+ // If the panel gets the focus *by way of getting it set directly*
+ // we move it to the first window that can get it.
+
+ wxNode *node = GetChildren().First();
+ while (node)
+ {
+ wxWindow *child = (wxWindow*) node->Data();
+ if (child->AcceptsFocus())
+ {
+ m_winLastFocused = child; // should be redundant, but it is not
+ child->SetFocus();
+ return;
+ }
+ node = node->Next();
+ }
+
+ m_winLastFocused = (wxWindow*) NULL;
+
+ wxWindow::SetFocus();
+}
+
void wxPanel::OnFocus(wxFocusEvent& event)
{
void wxPanel::OnFocus(wxFocusEvent& event)
{
- if ( m_winLastFocused )
+ // If the panel gets the focus *by way of getting clicked on*
+ // we move it to either the last window that had the focus or
+ // the first one that can get it.
+
+ if (m_winLastFocused)
{
// it might happen that the window got reparented...
{
// it might happen that the window got reparented...
- if ( m_winLastFocused->GetParent() != this )
- m_winLastFocused = (wxWindow *)NULL;
- else
+ if ( m_winLastFocused->GetParent() == this )
+ {
m_winLastFocused->SetFocus();
m_winLastFocused->SetFocus();
+
+ wxNode *node = GetChildren().First();
+ while (node)
+ {
+ wxWindow *child = (wxWindow*) node->Data();
+ if (child->AcceptsFocus())
+ {
+ m_winLastFocused = child; // should be redundant, but it is not
+ child->SetFocus();
+ return;
+ }
+ node = node->Next();
+ }
+
+ m_winLastFocused = (wxWindow*) NULL;
+
+ event.Skip();
/* win is a control: tab can be propagated up */
if ( (!ret) &&
((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) &&
/* win is a control: tab can be propagated up */
if ( (!ret) &&
((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) &&
- (win->HasFlag(wxTE_PROCESS_TAB) == 0))
+ (!win->HasFlag(wxTE_PROCESS_TAB)) &&
+ (win->GetParent()) &&
+ (win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
{
wxNavigationKeyEvent new_event;
{
wxNavigationKeyEvent new_event;
+ new_event.SetEventObject( win );
/* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
/* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
- if (win->m_wxwindow)
- {
- if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow))
- {
- GTK_WIDGET_SET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS);
-/*
- printf( "SetFocus flag from " );
- if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
- printf( win->GetClassInfo()->GetClassName() );
- printf( ".\n" );
-*/
- }
- }
-
-
/*
printf( "OnSetFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
/*
printf( "OnSetFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
+ wxPanel *panel = wxDynamicCast(win->GetParent(), wxPanel);
+ if (panel)
+ {
+ panel->SetLastFocus(win);
+ }
+
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
event.SetEventObject( win );
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
event.SetEventObject( win );
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
- if (win->m_wxwindow)
- {
- if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow))
- GTK_WIDGET_UNSET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS);
- }
-
/*
printf( "OnKillFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
/*
printf( "OnKillFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
child->m_y,
child->m_width,
child->m_height );
child->m_y,
child->m_width,
child->m_height );
-
- if (parent->HasFlag(wxTAB_TRAVERSAL))
- {
- /* we now allow a window to get the focus as long as it
- doesn't have any children. */
- GTK_WIDGET_UNSET_FLAGS( parent->m_wxwindow, GTK_CAN_FOCUS );
- }
}
//-----------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------
}
#endif // GTK_MINOR_VERSION
}
#endif // GTK_MINOR_VERSION
- if (HasFlag(wxTAB_TRAVERSAL))
- {
- /* we now allow a window to get the focus as long as it
- doesn't have any children. */
- GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
- m_acceptsFocus = FALSE;
- }
- else
- {
- GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
- m_acceptsFocus = TRUE;
- }
+ GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
+ m_acceptsFocus = TRUE;
#if (GTK_MINOR_VERSION == 0)
// shut the viewport up
#if (GTK_MINOR_VERSION == 0)
// shut the viewport up
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
- wxNode *node = m_children.First();
- while (node)
- {
- wxWindow *child = (wxWindow*) node->Data();
- if (child->AcceptsFocus())
- {
- child->SetFocus();
- return;
- }
- node = node->Next();
- }
-
if (m_wxwindow)
{
gtk_widget_grab_focus (m_wxwindow);
if (m_wxwindow)
{
gtk_widget_grab_focus (m_wxwindow);
/* win is a control: tab can be propagated up */
if ( (!ret) &&
((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) &&
/* win is a control: tab can be propagated up */
if ( (!ret) &&
((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) &&
- (win->HasFlag(wxTE_PROCESS_TAB) == 0))
+ (!win->HasFlag(wxTE_PROCESS_TAB)) &&
+ (win->GetParent()) &&
+ (win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
{
wxNavigationKeyEvent new_event;
{
wxNavigationKeyEvent new_event;
+ new_event.SetEventObject( win );
/* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
/* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
- if (win->m_wxwindow)
- {
- if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow))
- {
- GTK_WIDGET_SET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS);
-/*
- printf( "SetFocus flag from " );
- if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
- printf( win->GetClassInfo()->GetClassName() );
- printf( ".\n" );
-*/
- }
- }
-
-
/*
printf( "OnSetFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
/*
printf( "OnSetFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
+ wxPanel *panel = wxDynamicCast(win->GetParent(), wxPanel);
+ if (panel)
+ {
+ panel->SetLastFocus(win);
+ }
+
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
event.SetEventObject( win );
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
event.SetEventObject( win );
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
- if (win->m_wxwindow)
- {
- if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow))
- GTK_WIDGET_UNSET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS);
- }
-
/*
printf( "OnKillFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
/*
printf( "OnKillFocus from " );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
child->m_y,
child->m_width,
child->m_height );
child->m_y,
child->m_width,
child->m_height );
-
- if (parent->HasFlag(wxTAB_TRAVERSAL))
- {
- /* we now allow a window to get the focus as long as it
- doesn't have any children. */
- GTK_WIDGET_UNSET_FLAGS( parent->m_wxwindow, GTK_CAN_FOCUS );
- }
}
//-----------------------------------------------------------------------------
}
//-----------------------------------------------------------------------------
}
#endif // GTK_MINOR_VERSION
}
#endif // GTK_MINOR_VERSION
- if (HasFlag(wxTAB_TRAVERSAL))
- {
- /* we now allow a window to get the focus as long as it
- doesn't have any children. */
- GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
- m_acceptsFocus = FALSE;
- }
- else
- {
- GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
- m_acceptsFocus = TRUE;
- }
+ GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
+ m_acceptsFocus = TRUE;
#if (GTK_MINOR_VERSION == 0)
// shut the viewport up
#if (GTK_MINOR_VERSION == 0)
// shut the viewport up
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
- wxNode *node = m_children.First();
- while (node)
- {
- wxWindow *child = (wxWindow*) node->Data();
- if (child->AcceptsFocus())
- {
- child->SetFocus();
- return;
- }
- node = node->Next();
- }
-
if (m_wxwindow)
{
gtk_widget_grab_focus (m_wxwindow);
if (m_wxwindow)
{
gtk_widget_grab_focus (m_wxwindow);