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:
Robert Roebling
1999-06-06 16:07:39 +00:00
parent 7cc7f0eb18
commit 5bd9e5192b
9 changed files with 294 additions and 242 deletions

View File

@@ -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 );
}
}

View File

@@ -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),

View File

@@ -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 );