]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/frame.cpp
made the code more wxMSW compatible
[wxWidgets.git] / src / gtk1 / frame.cpp
index c0631c4fce53f4bf2130cd3979edf2bbb3984570..2e05c91f089f870b7d4e600085733614f18e6083 100644 (file)
@@ -65,8 +65,9 @@ bool gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(
 //-----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(wxFrame, wxWindow)
-  EVT_CLOSE(wxFrame::OnCloseWindow)
   EVT_SIZE(wxFrame::OnSize)
+  EVT_CLOSE(wxFrame::OnCloseWindow)
+  EVT_IDLE(wxFrame::OnIdle)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow)
@@ -171,9 +172,12 @@ void wxFrame::Enable( bool enable )
   gtk_widget_set_sensitive( m_mainWindow, enable );
 };
 
-void wxFrame::OnCloseWindow( wxCloseEvent& WXUNUSED(event) )
+void wxFrame::OnCloseWindow( wxCloseEvent &event )
 {
-  this->Destroy();
+    if ( GetEventHandler()->OnClose() || event.GetForce())
+    {
+        this->Destroy();
+    }
 };
 
 bool wxFrame::Destroy(void)
@@ -289,7 +293,7 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
   }
 };
 
-void SetInvokingWindow( wxMenu *menu, wxWindow *win )
+static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
 {
   menu->SetInvokingWindow( win );
   wxNode *node = menu->m_items.First();
@@ -304,18 +308,24 @@ void SetInvokingWindow( wxMenu *menu, wxWindow *win )
 void wxFrame::SetMenuBar( wxMenuBar *menuBar )
 {
   m_frameMenuBar = menuBar;
-
-  wxNode *node = m_frameMenuBar->m_menus.First();
-  while (node)
+  
+  if (m_frameMenuBar)
   {
-    wxMenu *menu = (wxMenu*)node->Data();
-    SetInvokingWindow( menu, this );
-    node = node->Next();
-  };
-
-  m_frameMenuBar->m_parent = this;
-  gtk_myfixed_put( GTK_MYFIXED(m_mainWindow),
-    m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y );
+    if (m_frameMenuBar->m_parent != this)
+    {
+      wxNode *node = m_frameMenuBar->m_menus.First();
+      while (node)
+      {
+        wxMenu *menu = (wxMenu*)node->Data();
+        SetInvokingWindow( menu, this );
+        node = node->Next();
+      };
+  
+      m_frameMenuBar->m_parent = this;
+      gtk_myfixed_put( GTK_MYFIXED(m_mainWindow),
+        m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y );
+    }
+  }
 };
 
 bool wxFrame::CreateStatusBar( int number )
@@ -360,3 +370,54 @@ wxString wxFrame::GetTitle(void) const
   return (wxString&)m_title;
 };
 
+void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
+{
+  DoMenuUpdates();
+}
+
+// Query app for menu item updates (called from OnIdle)
+void wxFrame::DoMenuUpdates(void)
+{
+  wxMenuBar* bar = GetMenuBar();
+  if (!bar) return;
+
+  wxNode *node = bar->m_menus.First();
+  while (node)
+  {
+    wxMenu* menu = (wxMenu*)node->Data();
+    DoMenuUpdates(menu);
+    
+    node = node->Next();
+  };
+}
+
+void wxFrame::DoMenuUpdates(wxMenu* menu)
+{
+  wxNode* node = menu->m_items.First();
+  while (node)
+  {
+    wxMenuItem* item = (wxMenuItem*) node->Data();
+    if ( !item->IsSeparator() )
+    {
+        wxWindowID id = item->GetId();
+      wxUpdateUIEvent event(id);
+      event.SetEventObject( this );
+
+      if (GetEventHandler()->ProcessEvent(event))
+      {
+        if (event.GetSetText())
+          menu->SetLabel(id, event.GetText());
+        if (event.GetSetChecked())
+          menu->Check(id, event.GetChecked());
+        if (event.GetSetEnabled())
+          menu->Enable(id, event.GetEnabled());
+      }
+
+      if (item->GetSubMenu())
+        DoMenuUpdates(item->GetSubMenu());
+    }
+    node = node->Next();
+  }
+}
+
+