Corrected hotkeys for MDI menus.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2679 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -813,25 +813,6 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
|
||||
}
|
||||
}
|
||||
|
||||
static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
|
||||
#if (GTK_MINOR_VERSION > 0)
|
||||
/* support for native hot keys */
|
||||
gtk_accel_group_attach( menu->m_accel, GTK_OBJECT(win->m_widget));
|
||||
#endif
|
||||
|
||||
wxNode *node = menu->GetItems().First();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = (wxMenuItem*)node->Data();
|
||||
if (menuitem->IsSubMenu())
|
||||
SetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
void wxFrame::SetMenuBar( wxMenuBar *menuBar )
|
||||
{
|
||||
wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
|
||||
@@ -841,18 +822,7 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar )
|
||||
|
||||
if (m_frameMenuBar)
|
||||
{
|
||||
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
||||
/* support for native key accelerators indicated by underscroes */
|
||||
gtk_accel_group_attach( m_frameMenuBar->m_accel, GTK_OBJECT(m_widget));
|
||||
#endif
|
||||
|
||||
wxNode *node = m_frameMenuBar->GetMenus().First();
|
||||
while (node)
|
||||
{
|
||||
wxMenu *menu = (wxMenu*)node->Data();
|
||||
SetInvokingWindow( menu, this );
|
||||
node = node->Next();
|
||||
}
|
||||
m_frameMenuBar->SetInvokingWindow( this );
|
||||
|
||||
if (m_frameMenuBar->GetParent() != this)
|
||||
{
|
||||
@@ -872,6 +842,8 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar )
|
||||
gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
|
||||
GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
|
||||
}
|
||||
|
||||
m_frameMenuBar->Show( TRUE );
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -126,21 +126,54 @@ void wxMDIParentFrame::OnInternalIdle()
|
||||
while (node)
|
||||
{
|
||||
wxMDIChildFrame *child_frame = (wxMDIChildFrame *)node->Data();
|
||||
wxMenuBar *menu_bar = child_frame->m_menuBar;
|
||||
if (child_frame->m_menuBar)
|
||||
{
|
||||
if (child_frame == active_child_frame)
|
||||
{
|
||||
gtk_widget_show( child_frame->m_menuBar->m_widget );
|
||||
visible_child_menu = TRUE;
|
||||
if (menu_bar->Show(TRUE))
|
||||
{
|
||||
menu_bar->m_width = m_width;
|
||||
menu_bar->m_height = wxMENU_HEIGHT;
|
||||
gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget),
|
||||
menu_bar->m_widget,
|
||||
0, 0, m_width, wxMENU_HEIGHT );
|
||||
menu_bar->SetInvokingWindow( child_frame );
|
||||
}
|
||||
visible_child_menu = TRUE;
|
||||
}
|
||||
else
|
||||
gtk_widget_hide( child_frame->m_menuBar->m_widget );
|
||||
{
|
||||
if (menu_bar->Show(FALSE))
|
||||
{
|
||||
menu_bar->UnsetInvokingWindow( child_frame );
|
||||
}
|
||||
}
|
||||
}
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
/* show/hide parent menu bar as required */
|
||||
if (m_frameMenuBar) m_frameMenuBar->Show( !visible_child_menu );
|
||||
if ((m_frameMenuBar) &&
|
||||
(m_frameMenuBar->IsShown() == visible_child_menu))
|
||||
{
|
||||
if (visible_child_menu)
|
||||
{
|
||||
m_frameMenuBar->Show( FALSE );
|
||||
m_frameMenuBar->UnsetInvokingWindow( this );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_frameMenuBar->Show( TRUE );
|
||||
m_frameMenuBar->SetInvokingWindow( this );
|
||||
|
||||
m_frameMenuBar->m_width = m_width;
|
||||
m_frameMenuBar->m_height = wxMENU_HEIGHT;
|
||||
gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget),
|
||||
m_frameMenuBar->m_widget,
|
||||
0, 0, m_width, wxMENU_HEIGHT );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxMDIParentFrame::GetClientSize(int *width, int *height ) const
|
||||
@@ -260,42 +293,17 @@ void wxMDIChildFrame::AddChild( wxWindow *child )
|
||||
wxWindow::AddChild( child );
|
||||
}
|
||||
|
||||
static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
wxNode *node = menu->GetItems().First();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = (wxMenuItem*)node->Data();
|
||||
if (menuitem->IsSubMenu())
|
||||
SetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
void wxMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar )
|
||||
{
|
||||
wxASSERT_MSG( m_menuBar == NULL, _T("Only one menubar allowed") );
|
||||
|
||||
m_menuBar = menu_bar;
|
||||
|
||||
if (m_menuBar)
|
||||
{
|
||||
wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->GetParent();
|
||||
|
||||
if (m_menuBar->GetParent() != this)
|
||||
{
|
||||
wxNode *node = m_menuBar->GetMenus().First();
|
||||
while (node)
|
||||
{
|
||||
wxMenu *menu = (wxMenu*)node->Data();
|
||||
SetInvokingWindow( menu, this );
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
m_menuBar->SetParent( mdi_frame );
|
||||
}
|
||||
|
||||
/* the menu bar of the child window is shown in idle time as needed */
|
||||
gtk_widget_hide( m_menuBar->m_widget );
|
||||
m_menuBar->SetParent( mdi_frame );
|
||||
|
||||
/* insert the invisible menu bar into the _parent_ mdi frame */
|
||||
gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWidget),
|
||||
|
@@ -63,8 +63,6 @@ wxMenuBar::wxMenuBar( long style )
|
||||
}
|
||||
|
||||
PostCreation();
|
||||
|
||||
Show( TRUE );
|
||||
}
|
||||
|
||||
wxMenuBar::wxMenuBar()
|
||||
@@ -88,8 +86,6 @@ wxMenuBar::wxMenuBar()
|
||||
m_widget = GTK_WIDGET(m_menubar);
|
||||
|
||||
PostCreation();
|
||||
|
||||
Show( TRUE );
|
||||
}
|
||||
|
||||
wxMenuBar::~wxMenuBar()
|
||||
@@ -97,6 +93,91 @@ wxMenuBar::~wxMenuBar()
|
||||
// how to destroy a GtkItemFactory ?
|
||||
}
|
||||
|
||||
static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||
{
|
||||
menu->SetInvokingWindow( (wxWindow*) NULL );
|
||||
|
||||
#if (GTK_MINOR_VERSION > 0)
|
||||
wxWindow *top_frame = win;
|
||||
while (top_frame->GetParent()) top_frame = top_frame->GetParent();
|
||||
|
||||
/* support for native hot keys */
|
||||
gtk_accel_group_detach( menu->m_accel, GTK_OBJECT(top_frame->m_widget) );
|
||||
#endif
|
||||
|
||||
wxNode *node = menu->GetItems().First();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = (wxMenuItem*)node->Data();
|
||||
if (menuitem->IsSubMenu())
|
||||
wxMenubarUnsetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||
{
|
||||
menu->SetInvokingWindow( win );
|
||||
|
||||
#if (GTK_MINOR_VERSION > 0)
|
||||
wxWindow *top_frame = win;
|
||||
while (top_frame->GetParent())
|
||||
top_frame = top_frame->GetParent();
|
||||
|
||||
/* support for native hot keys */
|
||||
gtk_accel_group_attach( menu->m_accel, GTK_OBJECT(top_frame->m_widget) );
|
||||
#endif
|
||||
|
||||
wxNode *node = menu->GetItems().First();
|
||||
while (node)
|
||||
{
|
||||
wxMenuItem *menuitem = (wxMenuItem*)node->Data();
|
||||
if (menuitem->IsSubMenu())
|
||||
wxMenubarSetInvokingWindow( menuitem->GetSubMenu(), win );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
void wxMenuBar::SetInvokingWindow( wxWindow *win )
|
||||
{
|
||||
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
||||
wxWindow *top_frame = win;
|
||||
while (top_frame->GetParent())
|
||||
top_frame = top_frame->GetParent();
|
||||
|
||||
/* support for native key accelerators indicated by underscroes */
|
||||
gtk_accel_group_attach( m_accel, GTK_OBJECT(top_frame->m_widget) );
|
||||
#endif
|
||||
|
||||
wxNode *node = m_menus.First();
|
||||
while (node)
|
||||
{
|
||||
wxMenu *menu = (wxMenu*)node->Data();
|
||||
wxMenubarSetInvokingWindow( menu, win );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
void wxMenuBar::UnsetInvokingWindow( wxWindow *win )
|
||||
{
|
||||
#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
|
||||
wxWindow *top_frame = win;
|
||||
while (top_frame->GetParent())
|
||||
top_frame = top_frame->GetParent();
|
||||
|
||||
/* support for native key accelerators indicated by underscroes */
|
||||
gtk_accel_group_detach( m_accel, GTK_OBJECT(top_frame->m_widget) );
|
||||
#endif
|
||||
|
||||
wxNode *node = m_menus.First();
|
||||
while (node)
|
||||
{
|
||||
wxMenu *menu = (wxMenu*)node->Data();
|
||||
wxMenubarUnsetInvokingWindow( menu, win );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
void wxMenuBar::Append( wxMenu *menu, const wxString &title )
|
||||
{
|
||||
m_menus.Append( menu );
|
||||
|
Reference in New Issue
Block a user