]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/frame.cpp
fixed (rare but fatal) bug in wxWindowDisabler
[wxWidgets.git] / src / mac / frame.cpp
index 59b57e6cb5e38ee1fb0fe618e6ee4aa373f541f8..cded59c604887d003c26c948ada38447adf10940 100644 (file)
@@ -28,7 +28,6 @@
 extern wxList wxModelessWindows;
 extern wxList wxPendingDelete;
 
 extern wxList wxModelessWindows;
 extern wxList wxPendingDelete;
 
-#if !USE_SHARED_LIBRARY
 BEGIN_EVENT_TABLE(wxFrame, wxWindow)
   EVT_SIZE(wxFrame::OnSize)
   EVT_ACTIVATE(wxFrame::OnActivate)
 BEGIN_EVENT_TABLE(wxFrame, wxWindow)
   EVT_SIZE(wxFrame::OnSize)
   EVT_ACTIVATE(wxFrame::OnActivate)
@@ -39,7 +38,6 @@ BEGIN_EVENT_TABLE(wxFrame, wxWindow)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
-#endif
 
 #if wxUSE_NATIVE_STATUSBAR
 bool wxFrame::m_useNativeStatusBar = TRUE;
 
 #if wxUSE_NATIVE_STATUSBAR
 bool wxFrame::m_useNativeStatusBar = TRUE;
@@ -341,6 +339,56 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event)
 
 // Default resizing behaviour - if only ONE subwindow,
 // resize to client rectangle size
 
 // Default resizing behaviour - if only ONE subwindow,
 // resize to client rectangle size
+void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event) )
+{
+    DoMenuUpdates();
+}
+
+
+// update all menus
+void wxFrame::DoMenuUpdates()
+{
+    wxMenuBar* bar = GetMenuBar();
+
+    if ( bar != NULL )
+    {
+        int nCount = bar->GetMenuCount();
+        for (int n = 0; n < nCount; n++)
+            DoMenuUpdates(bar->GetMenu(n), (wxWindow*) NULL);
+    }
+}
+
+// update a menu and all submenus recursively
+void wxFrame::DoMenuUpdates(wxMenu* menu, wxWindow* WXUNUSED(focusWin))
+{
+    wxEvtHandler* evtHandler = GetEventHandler();
+    wxMenuItemList::Node* node = menu->GetMenuItems().GetFirst();
+    while (node)
+    {
+        wxMenuItem* item = node->GetData();
+        if ( !item->IsSeparator() )
+        {
+            wxWindowID id = item->GetId();
+            wxUpdateUIEvent event(id);
+            event.SetEventObject( this );
+
+            if (evtHandler->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(), (wxWindow*) NULL);
+        }
+        node = node->GetNext();
+    }
+}
+
 void wxFrame::OnSize(wxSizeEvent& event)
 {
   // if we're using constraints - do use them
 void wxFrame::OnSize(wxSizeEvent& event)
 {
   // if we're using constraints - do use them
@@ -490,9 +538,9 @@ wxPoint wxFrame::GetClientAreaOrigin() const
     return pt;
 }
 
     return pt;
 }
 
-void wxFrame::GetClientSize(int *x, int *y) const
+void wxFrame::DoGetClientSize(int *x, int *y) const
 {
 {
-       wxWindow::GetClientSize( x , y ) ;
+       wxWindow::DoGetClientSize( x , y ) ;
 
   if ( GetStatusBar() )
   {
 
   if ( GetStatusBar() )
   {