]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/menucmn.cpp
Make code reading BMP files more robust.
[wxWidgets.git] / src / common / menucmn.cpp
index d53056d9ee3ff34fedc5ec5240e31639c1105672..dacfbf4d90a9ba68d7b2b8c42df8a7d08c676845 100644 (file)
@@ -69,7 +69,7 @@ template<> void wxCollectionToVariantArray( wxMenuItemList const &theList,
 #endif
 
 wxBEGIN_PROPERTIES_TABLE(wxMenu)
-wxEVENT_PROPERTY( Select, wxEVT_COMMAND_MENU_SELECTED, wxCommandEvent)
+wxEVENT_PROPERTY( Select, wxEVT_MENU, wxCommandEvent)
 
 wxPROPERTY( Title, wxString, SetTitle, GetTitle, wxString(), \
            0 /*flags*/, wxT("Helpstring"), wxT("group") )
@@ -598,14 +598,6 @@ wxMenuItem* wxMenuBase::FindItemByPosition(size_t position) const
 void wxMenuBase::UpdateUI(wxEvtHandler* source)
 {
     wxWindow * const win = GetWindow();
-    if ( win )
-    {
-        // Don't update menus if the parent
-        // frame is about to get deleted
-        wxWindow *tlw = wxGetTopLevelParent(win);
-        if (tlw && wxPendingDelete.Member(tlw))
-            return;
-    }
 
     if ( !source && win )
         source = win->GetEventHandler();
@@ -622,7 +614,7 @@ void wxMenuBase::UpdateUI(wxEvtHandler* source)
         {
             wxWindowID itemid = item->GetId();
             wxUpdateUIEvent event(itemid);
-            event.SetEventObject( source );
+            event.SetEventObject( this );
 
             if ( source->ProcessEvent(event) )
             {
@@ -647,26 +639,39 @@ void wxMenuBase::UpdateUI(wxEvtHandler* source)
 
 bool wxMenuBase::SendEvent(int itemid, int checked)
 {
-    wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, itemid);
+    wxCommandEvent event(wxEVT_MENU, itemid);
     event.SetEventObject(this);
     event.SetInt(checked);
 
-    bool processed = false;
+    wxWindow* const win = GetWindow();
+    wxMenuBar* const mb = GetMenuBar();
 
     // Try the menu's event handler first
     wxEvtHandler *handler = GetEventHandler();
     if ( handler )
-        processed = handler->SafelyProcessEvent(event);
-
-    // Try the window the menu was popped up from or its menu bar belongs to
-    if ( !processed )
     {
-        wxWindow * const win = GetWindow();
-        if ( win )
-            processed = win->HandleWindowEvent(event);
+        // Indicate to the event processing code that we're going to pass this
+        // event to another handler if it's not processed here to prevent it
+        // from passing the event to wxTheApp: this will be done below if we do
+        // have the associated window.
+        if ( win || mb )
+            event.SetWillBeProcessedAgain();
+
+        if ( handler->SafelyProcessEvent(event) )
+            return true;
     }
 
-    return processed;
+    // If this menu is part of the menu bar, process the event there: this will
+    // also propagate it upwards to the window containing the menu bar.
+    if ( mb )
+        return mb->HandleWindowEvent(event);
+
+    // Try the window the menu was popped up from.
+    if ( win )
+        return win->HandleWindowEvent(event);
+
+    // Not processed.
+    return false;
 }
 
 // ----------------------------------------------------------------------------
@@ -920,6 +925,7 @@ void wxMenuBarBase::Attach(wxFrame *frame)
 {
     wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") );
 
+    SetParent(frame);
     m_menuBarFrame = frame;
 }
 
@@ -928,6 +934,7 @@ void wxMenuBarBase::Detach()
     wxASSERT_MSG( IsAttached(), wxT("detaching unattached menubar") );
 
     m_menuBarFrame = NULL;
+    SetParent(NULL);
 }
 
 // ----------------------------------------------------------------------------
@@ -1046,18 +1053,13 @@ wxString wxMenuBarBase::GetHelpString(int itemid) const
 
 void wxMenuBarBase::UpdateMenus()
 {
-    wxEvtHandler* source;
     wxMenu* menu;
     int nCount = GetMenuCount();
     for (int n = 0; n < nCount; n++)
     {
         menu = GetMenu( n );
         if (menu != NULL)
-        {
-            source = menu->GetEventHandler();
-            if (source != NULL)
-                menu->UpdateUI( source );
-        }
+            menu->UpdateUI( NULL );
     }
 }